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; }