Gym-100712J 桶排序思想&反向思维

来源:互联网 发布:html5shiv.min.js下载 编辑:程序博客网 时间:2024/04/28 11:12


给一群儿童分配糖果,每位儿童只能一包,满足一些条件,“公平分配”:

相同年龄的分一样多,年龄大的必须分的比前者多。

三行,第二行是儿童的年龄,第三行是包里的糖果


思路: 数据够小,儿童年龄只在5到15,直接暴力,利用桶排序的思想,把儿童和糖果的数量存在a和b数组中,下标即是他们的标号,这样从1开始,默认就排了序。

从5到15岁数遍历,下标a是从5开始,b是从1开始,

这里从反面开始,只要b的数量小于当前当前儿童年龄i的数量(相同糖果的数量只能等于或者多于同一年龄儿童的数量),糖果数量就要前进,只要满住,儿童年龄前进一位。如果超过糖果数量最大50,则没找到满足,退出打印No,否则遍历完15岁,即全部找到。

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;const int maxn = 1000+10;int a[maxn];int b[maxn];int main(){    //    freopen("in.txt","r",stdin);    int t,t1,t2;    scanf("%d",&t);    while(t--)    {        int n,m;        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        int dd = 0;        cin>>n>>m;        while(n--)        {            cin>>t1;            a[t1]++;        }        while(m--)        {            cin>>t2;            b[t2]++;        }        int pos = 0;        for(int i = 5; i <= 15; i++)        {            if(a[i])            {                pos++;                while(pos <= 50 && b[pos] < a[i])                    pos++;                if(pos>50)                {                    dd = 1;                }            }        }        if(dd)            puts("NO");        else            puts("YES");    }    return 0;}


0 0
原创粉丝点击