在测试中给N个问题,全班有K个学生。在这K名学生中,有N名学生每个记忆了一个问题。一封邮件最多可以包含X个问题。
找到所需的最少邮件数,以使整个班级都了解所有问题。
注意:邮件具有以下信息-发件人姓名,收件人姓名和问题
例子:
Input: N = 3, K = 3, X = 1
Output: 6
Student 1 sends his question to student 2 and student 3 (2 mails),
so does student 2 and student 3 so total mails = 2 * 3 = 6
Input: N = 4, K = 9, X = 2
Output: 19
Refer to the flowchart below
流程图:
N = 4,K = 9,X = 2
数据透视=第四名学生
学生1、2和3向学生4发送3封邮件。现在,学生4拥有所有问题。他相应地分发它们,每3个已经有1个问题的学生发送3/2 = 2(使用ceil)邮件,剩下5个学生的4/2 = 2个邮件。因此,邮件总数为(3 + 2 * 3 + 2 * 5)= 19
方法:这里使用了贪婪的方法。选择一个枢轴,该枢轴首先接收所有问题,然后相应地分配它们。这将需要最少的步骤。 N-1名学生,将他们的每个问题发送给Nth名学生。因此,第N个学生有所有问题(到目前为止发送的邮件= N-1)。现在提到邮件中包含发件人的姓名,因此第N个学生知道哪个问题来自谁,因此他可以避免发回相同的问题。现在,第N个学生充当分发者,他将问题打包并相应地发送给他们。每个N-1学生都需要了解其余N-1个问题。因此,需要发送给每个邮件的最少邮件为ceil((N-1)/ X),其中X是邮件可以容纳的最大问题数,而ceil表示最小整数函数。因此,到目前为止发送的总邮件数= ceil((N-1)/ X)*(N-1)+(N-1)。因此,N个学生知道所有问题。其余的KN学生需要了解所有N个问题,因此每个人都必须接收至少ceil(N / X)封邮件,其中X是邮件可以容纳的最大问题数,而ceil表示最小整数函数。因此,收到的邮件总数为:
ceil(N/X) * (K-N) + (( ceil((N-1)/X)) * (N-1)) + (N-1)
下面是上述方法的实现:
C++
// C++ code to find the
// minimum number of mails
#include
#define ll long long int
using namespace std;
// Function returns the min no of mails required
long long int MinimumMail(int n, int k, int x)
{
// Using the formula derived above
ll m = (n - 1) + (ll)ceil((n - 1) * 1.0 / x) * (n - 1)
+ (ll)ceil(n * 1.0 / x) * (k - n);
return m;
}
// Driver Code
int main()
{
// no of questions
int N = 4;
// no of students
int K = 9;
// maximum no of questions a mail can hold
int X = 2;
// Calling function
cout << MinimumMail(N, K, X) << endl;
return 0;
}
Java
// Java code to find the
// minimum number of mails
import java.io.*;
import java.util.*;
import java.lang.*;
class GFG
{
// Function returns the min
// no of mails required
static double MinimumMail(int n,
int k,
int x)
{
// Using the formula
// derived above
double m = (n - 1) + Math.ceil((n - 1) * 1.0 / x) * (n - 1)
+ Math.ceil(n * 1.0 / x) * (k - n);
return m;
}
// Driver Code
public static void main(String[] args)
{
// no of questions
int N = 4;
// no of students
int K = 9;
// maximum no of questions
// a mail can hold
int X = 2;
// Calling function
System.out.print((int)MinimumMail(N, K, X) + "\n");
}
}
Python3
# Python3 code to find the minimum
# number of mails
import math
# Function returns the min no of
# mails required
def MinimumMail(n, k, x):
# Using the formula derived above
m = ((n - 1) + int(math.ceil((n - 1) * 1.0 / x) *
(n - 1) + math.ceil(n * 1.0 / x) * (k - n)));
return m;
# Driver Code
# no of questions
N = 4;
# no of students
K = 9;
# maximum no of questions
# a mail can hold
X = 2;
# Calling function
print(MinimumMail(N, K, X));
# This code is contributed by mits
C#
// C# code to find the
// minimum number of mails
using System;
class GFG
{
// Function returns the min
// no of mails required
static double MinimumMail(int n,
int k,
int x)
{
// Using the formula
// derived above
double m = (n - 1) + Math.Ceiling((n - 1) *
1.0 / x) * (n - 1) +
Math.Ceiling(n * 1.0 /
x) * (k - n);
return m;
}
// Driver Code
public static void Main()
{
// no of questions
int N = 4;
// no of students
int K = 9;
// maximum no of questions
// a mail can hold
int X = 2;
// Calling function
Console.WriteLine((int)MinimumMail(N, K, X) + "\n");
}
}
// This code is contributed by anuj_67.
PHP
19