📜  根据学生年龄分配糖果

📅  最后修改于: 2021-04-29 11:56:48             🧑  作者: Mango

给定两个整数数组ages和packs,其中ages存储不同学生的年龄,而pack元素存储该数据包具有的糖果数(完整的数组代表数据包的数量)。糖果可以在学生之间分配:

  1. 每个学生只能得到一包糖果。
  2. 所有同龄学生必须获得相等数量的糖果。
  3. 一个年长的学生必须比所有比他年轻的学生得到更多的糖果。

任务是确定是否有可能以所述方式分配糖果。如果可能,请打印“是”,否则打印“否”。

例子:

方法:

  • 制作2个频率数组,其中一个将存储特定年龄的学生人数,另一个将存储特定数量的糖果的数据包数量。
  • 然后遍历从最小年龄开始的年龄和每个年龄的频率阵列,尝试找到大于或等于所选年龄的学生人数的糖果包(从最少的糖果包数量开始) )
  • 如果上述情况失败,则答案为“否”,重复上述步骤,直到所有学生都得到糖果并最后打印“是”为止。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Function to check The validity of distribution
void check_distribution(int n, int k,
                        int age[], int candy[])
{
     
    // Stroring the max age of all
    // students + 1
    int mxage = *(std::max_element(
        age, age + n)) + 1;
   
    // Stroring the max candy + 1
    int mxcandy = *(std::max_element(
        candy, candy + k)) + 1;
               
    int fr1[mxage] = {0};
    int fr2[mxcandy] = {0};
   
    // Creating the frequency array of
    // the age of students
    for(int j = 0; j < n; j++)
    {
        fr1[age[j]] += 1;
    }
   
    // Creating the frequency array of the 
    // packets of candies
    for(int j = 0; j < k; j++)
    {
        fr2[candy[j]] += 1;
    }
   
    // Pointer to tell whether we have reached 
    // the end of candy frequency array
    k = 0;
   
    // Flag to tell if distribution
    // is possible or not
    bool Tf = true;
    for(int j = 0; j < mxage; j++)
    {
        if (fr1[j] == 0)
            continue;
   
        // Flag to tell if we can choose
        // some candy packets for the
        // students with age j
        bool flag = false;
         
        while (k < mxcandy)
        {
             
            // If the quantity of packets is
            // greater than or equal to the
            // number of students of age j,
            // then we can choose these 
            // packets for the students
            if (fr1[j] <= fr2[k])
            {
                flag = true;
                break;
            }
            k += 1;
        }
   
        // Start searching from k + 1
        // in next operation
        k = k + 1;
   
        // If we cannot choose any packets 
        // then the answer is NO
        if (flag == false)
        {
            Tf = false;
            break;
        }
    }
         
    if (Tf)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}
 
// Driver code      
int main()
{
    int age[] = { 5, 15, 10 };
    int candy[] = { 2, 2, 2, 3, 3, 4 };
     
    int n = sizeof(age) / sizeof(age[0]);
    int k = sizeof(candy) / sizeof(candy[0]);
     
    check_distribution(n, k, age, candy);
 
    return 0;
}
 
// This code is contributed by divyeshrabadiya07


Java
// Java implementation of the approach
import java.util.*;
 
class Main
{
    // Function to check The validity of distribution
    public static void check_distribution(int n, int k,
                            int age[], int candy[])
    {
          
        // Stroring the max age of all
        // students + 1
        int mxage = age[0];
        for(int i = 0; i < age.length; i++)
        {
            if(mxage < age[i])
            {
                mxage = age[i];
            }
        }
        
        // Stroring the max candy + 1
        int mxcandy = candy[0];
        for(int i = 0; i < candy.length; i++)
        {
            if(mxcandy < candy[i])
            {
                mxcandy = candy[i];
            }
        }
          
        int fr1[] = new int[mxage + 1];
        Arrays.fill(fr1, 0);
        int fr2[] = new int[mxcandy + 1];
        Arrays.fill(fr2, 0);
         
        
        // Creating the frequency array of
        // the age of students
        for(int j = 0; j < n; j++)
        {
            fr1[age[j]] += 1;
        }
        
        // Creating the frequency array of the 
        // packets of candies
        for(int j = 0; j < k; j++)
        {
            fr2[candy[j]] += 1;
        }
        
        // Pointer to tell whether we have reached 
        // the end of candy frequency array
        k = 0;
        
        // Flag to tell if distribution
        // is possible or not
        boolean Tf = true;
        for(int j = 0; j < mxage; j++)
        {
            if (fr1[j] == 0)
                continue;
        
            // Flag to tell if we can choose
            // some candy packets for the
            // students with age j
            boolean flag = false;
              
            while (k < mxcandy)
            {
                  
                // If the quantity of packets is
                // greater than or equal to the
                // number of students of age j,
                // then we can choose these 
                // packets for the students
                if (fr1[j] <= fr2[k])
                {
                    flag = true;
                    break;
                }
                k += 1;
            }
        
            // Start searching from k + 1
            // in next operation
            k = k + 1;
        
            // If we cannot choose any packets 
            // then the answer is NO
            if (flag == false)
            {
                Tf = false;
                break;
            }
        }
              
        if (Tf)
            System.out.println("YES");
        else
            System.out.println("NO");
    }
   
  // Driver code
  public static void main(String[] args)
  {
    int age[] = { 5, 15, 10 };
    int candy[] = { 2, 2, 2, 3, 3, 4 };
    int n = age.length;
    int k = candy.length;
     
    check_distribution(n, k, age, candy);
  }
}
 
// This code is contributed by divyesh072019


Python3
# Python3 implementation of the approach
 
# Function to check The validity of distribution
def check_distribution(n, k, age, candy):
 
    # Stroring the max age of all students + 1
    mxage = max(age)+1
 
    # Stroring the max candy + 1
    mxcandy = max(candy)+1
    fr1 = [0] * mxage
    fr2 = [0] * mxcandy
 
    # creating the frequency array of the
    # age of students
    for j in range(n):
        fr1[age[j]] += 1
 
    # Creating the frequency array of the
    # packets of candies
    for j in range(k):
        fr2[candy[j]] += 1
 
    # pointer to tell whether we have reached
    # the end of candy frequency array
    k = 0
 
    # Flag to tell if distribution is possible or not
    Tf = True
    for j in range(mxage):
        if (fr1[j] == 0):
            continue
 
        # Flag to tell if we can choose some
        # candy packets for the students with age j
        flag = False
        while (k < mxcandy):
 
            # If the quantity of packets is greater 
            # than or equal to the number of students
            # of age j, then we can choose these
            # packets for the students
            if (fr1[j] <= fr2[k]):
                flag = True
                break
            k += 1
 
        # Start searching from k + 1 in next operation
        k = k + 1
 
        # If we cannot choose any packets
        # then the answer is NO
        if (flag == False):
            Tf = False
            break
    if (Tf):
        print("YES")
    else:
        print("NO")
 
# Driver code
age = [5, 15, 10]
candy = [2, 2, 2, 3, 3, 4]
n = len(age)
k = len(candy)
check_distribution(n, k, age, candy)


C#
// C# implementation of the approach
using System.IO;
using System;
class GFG
{
    // Function to check The validity of distribution
    static void check_distribution(int n,int k,
                                   int[] age,int[] candy)
    {
       
        // Stroring the max age of all
        // students + 1
        int mxage = age[0];
        for(int i = 0; i < age.Length; i++)
        {
            if(mxage < age[i])
            {
                mxage = age[i];
            }
        }
         
        // Stroring the max candy + 1
        int mxcandy = candy[0];
        for(int i = 0; i < candy.Length; i++)
        {
            if(mxcandy < candy[i])
            {
                mxcandy = candy[i];
            }
        }
         
        int[] fr1 = new int[mxage + 1];
        Array.Fill(fr1, 0);
        int[] fr2 = new int[mxcandy + 1];
        Array.Fill(fr2, 0);
         
        // Creating the frequency array of
        // the age of students
        for(int j = 0; j < n; j++)
        {
            fr1[age[j]] += 1;
        }
         
        // Creating the frequency array of the 
        // packets of candies
        for(int j = 0; j < k; j++)
        {
            fr2[candy[j]] += 1;
        }
         
        // Pointer to tell whether we have reached 
        // the end of candy frequency array
        k = 0;
         
        // Flag to tell if distribution
        // is possible or not
        bool Tf = true;
         
        for(int j = 0; j < mxage; j++)
        {
            if(fr1[j] == 0)
            {
                continue;
            }
             
            // Flag to tell if we can choose
            // some candy packets for the
            // students with age j
            bool flag = false;
             
            while (k < mxcandy)
            {
                   
                // If the quantity of packets is
                // greater than or equal to the
                // number of students of age j,
                // then we can choose these 
                // packets for the students
                if (fr1[j] <= fr2[k])
                {
                    flag = true;
                    break;
                }
                k += 1;
            }
             
            // Start searching from k + 1
            // in next operation
            k = k + 1;
             
            // If we cannot choose any packets 
            // then the answer is NO
            if (flag == false)
            {
                Tf = false;
                break;
            }
             
        }
         
        if(Tf)
        {
            Console.WriteLine("Yes");
        }
        else
        {
            Console.WriteLine("No");
        }
         
    }
     
    // Driver code
    static void Main()
    {
        int[] age = {5, 15, 10};
        int[] candy = { 2, 2, 2, 3, 3, 4 };
        int n = age.Length;
        int k = candy.Length;
         
        check_distribution(n, k, age, candy);
    }
}
 
// This code is contributed by avanitrachhadiya2155


Javascript


输出:
YES