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


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

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

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


思路: 数据够小,儿童年龄只在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;
}


posted @ 2017-05-07 22:21  Lawliet__zmz  阅读(222)  评论(0编辑  收藏  举报