• 第十四届蓝桥杯 三国游戏


    一开始的思路就是想着暴力,但是呢,如果真的用暴力一个一个列的话,连30%的数据都搞定不了,所以这里需要考虑别的办法。

    这道题的思路就是贪心

    我们这样想:既然要满足至少一个国X>Y+Z,那么我们何不变成X-Y-Z>0呢?这样可能会更好想一点。我们就这样存储每一个事件发生之后的差,然后进行排序。

    注意,这里的排序是最重要的一步,我们进行排序的目的就是为了找出最合适的选择的个数。

    也就是说,我们从大的差值开始往下累加,这个时候和可能会变小,也可能会变大,取决于发生这件事之后的差值是如何的。所以,这就是一种贪心的思想。

    注意,我们有三个国,所以要依次算出每个国赢的时候最多发生了多少个事件,所以需要比较3次,看看哪一个国赢的时候发生的事件最多。

    上代码:

    1. #include<iostream>
    2. #include<stdio.h>
    3. #include<cstring>
    4. #include<cstdlib>
    5. #include<cmath>
    6. #include<vector>
    7. #include<algorithm>
    8. #include<stack>
    9. #include<queue>
    10. #include<sstream>
    11. #include<map>
    12. #include<limits.h>
    13. #include<set>
    14. #define MAX 100010
    15. #define _for(i,a,b) for(int i=a;i<(b);i++)
    16. #define ALL(x) x.begin(),x.end()
    17. using namespace std;
    18. typedef long long LL;
    19. typedef pair<int, int> PII;
    20. LL n, m, counts, num;
    21. LL a[MAX];
    22. LL b[MAX];
    23. LL c[MAX];
    24. LL res = INT_MIN;
    25. bool cmp(LL a, LL b)
    26. {
    27. return a >= b;
    28. }
    29. LL solve(LL a[],LL b[], LL c[]) {
    30. LL cnt = 0;
    31. vector<LL>tmp;
    32. for (int i = 0; i < n; i++) {
    33. tmp.push_back(a[i] - b[i] - c[i]);//存储差值
    34. }
    35. sort(tmp.begin(), tmp.end(), cmp);//对各个事件之后的差值进行排序
    36. LL sum = 0;
    37. for (int i = 0; i < n; i++) {
    38. if (sum + tmp[i] > 0) {//从最大的差值开始累加,满足条件那么就是一个事件,cnt+1
    39. cnt++;
    40. sum += tmp[i];
    41. }
    42. else break;
    43. }
    44. return cnt;
    45. }
    46. int main() {
    47. ios::sync_with_stdio(false);
    48. cin.tie(NULL); cout.tie(NULL);
    49. cin >> n;
    50. for (int i = 0; i < n; i++)
    51. cin >> a[i];
    52. for (int i = 0; i < n; i++)
    53. cin >> b[i];
    54. for (int i = 0; i < n; i++)
    55. cin >> c[i];
    56. res = solve(a, b, c);//对于a赢时发生的最多事件
    57. res = max(res, solve(b, c, a));//b赢时发生的最多事件,后面两个的顺序是无所谓的。
    58. res = max(res, solve(c, b, a));//c赢时发生的最多事件。
    59. cout << res;
    60. return 0;
    61. }

  • 相关阅读:
    数学建模——插值拟合
    童装业务占比扩大,APS生产排产解决服装企业生产管理难题
    关于神经网络的英语单词有,神经网络的英文单词
    labuladong刷题——第一章(2) 反转单链表 (递归)
    c++常用知识
    ElasticSearch(上)——基础操作
    阿里二面:SpringBoot可以同时处理多少个请求?当场懵了。。。。
    LeetCode高频题78. 子集,返回该数组所有可能的子集(幂集),生成所有的子序列
    BootStrap在Vue中的安装使用详细教程
    【贪心算法】:LeetCode860.柠檬水找零
  • 原文地址:https://blog.csdn.net/m0_73917165/article/details/136690228