题目链接:http://lx.lanqiao.cn/problem.page?gpid=T361
问题描述
最近的m天盾神都去幼儿园陪小朋友们玩去了~
每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西。但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他小朋友的积木才能完成他的大作。如果某个小朋友完成了他的作品,那么他就会把自己的作品推倒,而无私地把他的所有积木都奉献出来;但是,如果他还没有完成自己的作品,他是不会把积木让出去的哟~
盾神看到这么和谐的小朋友们感到非常开心,于是想帮助他们所有人都完成他们各自的作品。盾神现在在想,这个理想有没有可能实现呢?于是把这个问题交给了他最信赖的你。
输入格式
第一行为一个数m。
接下来有m组数据。每一组的第一行为n,表示这天有n个小朋友。接下来的n行每行两个数,分别表示他现在拥有的积木数和他一共需要的积木数。
输出格式
输出m行,如果第i天能顺利完成所有作品,输出YES,否则输出NO。
样例输入
2
2
2 2
1 3
3
1 5
3 3
0 4样例输出
YES
NO
数据规模和约定
1<=n<=10000,1<=m<=10。
解题思路
先把能拼成的都拼了,然后把贡献出来的积木的数量都在到一起用rare表示。然后对不能直接拼成的根据完成作品还需要的积木数从小到大排序,然后依次枚举,如果rare >= 还需要的积木数,则完成并将原有牌加到rare里;如果rare < 还需要的积木数,则必然拼不成,输出NO
AC代码
#include <bits\stdc++.h>
using namespace std;
struct One {
int h,need,inter; //已有的积木,需要的,还需
}a[10005];
bool cmp(One t1,One t2)
{
return t1.inter < t2.inter;
}
const int INF = 0x3f3f3f3f;
int main()
{
int m,n;
cin >> m;
int rare,has;
while( m--) {
cin >> n;
rare = 0;
has = 0; //已经完成的人数
for(int i=0;i<n;i++) {
cin >> a[i].h >> a[i].need;
if(a[i].h >= a[i].need) {
rare += a[i].h;
a[i].inter = INF;
has++;
}
else
a[i].inter = a[i].need - a[i].h;
}
if(has == n) {
cout << "YES\n";
continue;
}
sort(a,a+n,cmp);
bool flag = false;
for(int i=0;i<n-has;i++) {
if(rare >= a[i].inter)
rare += a[i].h;
else {
cout << "NO\n";
flag = true;
break;
}
}
if(!flag)
cout << "YES\n";
}
}