给定两个整数数组ages和packs,其中ages存储不同学生的年龄,而pack元素存储该数据包具有的糖果数(完整的数组代表数据包的数量)。糖果可以在学生之间分配:
- 每个学生只能得到一包糖果。
- 所有同龄学生必须获得相等数量的糖果。
- 一个年长的学生必须比所有比他年轻的学生得到更多的糖果。
任务是确定是否有可能以所述方式分配糖果。如果可能,请打印“是”,否则打印“否”。
例子:
Input: ages[] = {5, 15, 10}, packs[] = {2, 2, 2, 3, 3, 4}
Output: YES
There are 3 students with age 5, 15 and 10.And there are 6 packets of candies containing 2, 2, 2, 3, 3, 4 candies respectively.
We will give one packet containing 2 candies to the student of age 5, one packet containing 3 candies to student with age 10 and give the packet containing 4 candies to student age 15
Input: ages[] = {5, 5, 6, 7}, packs[] = {5, 4, 6, 6}
Output: NO
方法:
- 制作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