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

问题描述
  最近的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。
这个贪心模拟做的还是很有趣的。
注意读题,"接下来的n行每行两个数,分别表示他现在拥有的积木数和他一共需要的积木数",是他一共需要的积木数,而不是他还需要的积木数。
他还需要的积木数 = 他一共需要的积木数 - 他现在拥有的积木数。
还是有些细节处理的。
解题思路:
先遍历一遍,把能拼成的都拼了,然后把学生拼完后,贡献出来的积木的数量用sum表示,这个sum用来给其他学生分配。然后对不能直接拼成的学生,根据完成作品还需要的积木数从小到大排序,然后依次枚举,如果sum >= 这个学生还需要的积木数,则完成并把他现在拥有的积木数加到sum里;如果sum < 他还需要的积木数,则必然拼不成,输出NO。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 struct Student{
 4     int h; //have,表示这个学生现在手里有的积木个数 
 5     int n; //need,表示这个学生所需要的积木总个数 
 6     int t;    //表示这个学生还需要的积木个数,也就是need-have 
 7 } s[10010]; //student结构体数组 
 8 bool cmp(Student s1, Student s2) {
 9     return s1.t < s2.t;
10 }
11 const int INF = 0x3f3f3f3f;
12 int main() {
13     int m;
14     cin >> m;
15     while (m--) {
16         int n;
17         cin >> n;
18         int sum = 0; //现在可以拿来分配的积木数 
19         int has = 0; //已经完成的人数 
20         for (int i = 1; i <= n; i++) {
21             cin >> s[i].h >> s[i].n;
22             if (s[i].h >= s[i].n) { //如果这个学生可以拼出积木 
23                 sum += s[i].h; //把他的积木充公,用来分给其他人 
24                 s[i].t = INF; //他不再需要积木了 
25                 has++; //已经完成的人数加1 
26             } else { //拼不成的话 
27                 s[i].t = s[i].n - s[i].h; //计算出他还需要的    
28             }
29         }
30         if (has == n) { //如果所有人完成了 
31             cout << "YES" << endl;
32             continue; 
33         }
34         sort(s + 1, s + 1 + n, cmp); 
35         bool flag = true;
36         for (int i = 1; i <= n - has; i++) { //遍历剩下的未完成的学生 
37             if (sum >= s[i].t) { //如果可用资源能满足这个学生的需求 
38                 sum += s[i].h; //充公 
39             } else  { //否则,死锁,都在等可用资源  
40                 cout << "NO" << endl;
41                 flag = false;
42                 break;
43             }
44         }
45         if (flag) {
46             cout << "YES" << endl;    
47         }
48     }
49     return 0;
50 } 
原文地址:https://www.cnblogs.com/fx1998/p/12731342.html