GYM 100712 J.Candy(水~)

来源:互联网 发布:linux切换中文输入法 编辑:程序博客网 时间:2024/05/12 03:10

Description
有n个孩子,m袋糖果,现在给出每个孩子的年龄和每袋糖果里的糖果数量,每个孩子只能拿一袋糖果,要求相同年龄的孩子要有相同的糖果数,年龄大的人要比年龄小的人糖果数多,问是否有一种合法的分配方案
Input
第一行一整数T表示用例组数,每组用例首先输入两个整数n和m分别表示孩子数和糖果袋数,之后n个整数a[i]表示第i个孩子的年龄,最后m个整数b[i]表示第i袋糖果的数量(1<=T<=128,1<=n<=100,1<=m<=200,5<=a[i]<=15,1<=b[i]<=50)
Output
如果存在合法分配方案则输出YES,否则输出NO
Sample Input
这里写图片描述
Sample Output
YES
NO
NO
Solution
记录每个年龄的孩子数和每个糖果数的袋数,之后从后往前游标法,给年龄最大的孩子数量尽可能多的糖果
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 111int T,n,m,a[maxn],b[maxn];int main(){    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        int temp;        for(int i=1;i<=n;i++)        {            scanf("%d",&temp);            a[temp]++;        }        for(int i=1;i<=m;i++)        {            scanf("%d",&temp);            b[temp]++;        }        int i=20,j=50,gg=0;        while(i)        {            if(!a[i])            {                i--;                continue;            }            while(j&&b[j]<a[i])j--;            if(!j)            {                gg=1;                break;             }            i--,j--;        }        printf("%s\n",gg?"NO":"YES");    }    return 0;}
0 0
原创粉丝点击