蓝桥杯 盾神与积木游戏 【贪心】

版权声明:记笔记~~~ https://blog.csdn.net/weixin_42765557/article/details/88046574

题目链接: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";	
	}
} 

猜你喜欢

转载自blog.csdn.net/weixin_42765557/article/details/88046574