zoukankan      html  css  js  c++  java
  • 蓝桥杯 盾神与积木游戏 贪心

    问题描述
      最近的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 } 
  • 相关阅读:
    C语言修炼-第2天
    static_cast, dynamic_cast, reinterpret_cast, const_cast的区别
    构造函数不能为虚函数的原因
    matlab2016b ubuntu命令行安装 + matconvnet的安装
    python debug open_files
    构造函数不能被继承的原因
    NNVM代码阅读
    ncnn阅读
    Deep TEN: Texture Encoding Network
    git命令笔记
  • 原文地址:https://www.cnblogs.com/fx1998/p/12731342.html
Copyright © 2011-2022 走看看