📜  分发所有问题所需的最少邮件数

📅  最后修改于: 2021-04-29 12:31:29             🧑  作者: Mango

在测试中给N个问题,全班有K个学生。在这K名学生中,有N名学生每个记忆了一个问题。一封邮件最多可以包含X个问题。
找到所需的最少邮件数,以使整个班级都了解所有问题。

注意:邮件具有以下信息-发件人姓名,收件人姓名和问题

例子:

流程图:
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表示最小整数函数。因此,收到的邮件总数为:

下面是上述方法的实现:

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