当前位置:   article > 正文

蓝桥杯20年第十一届国赛-答疑|贪心

蓝桥杯20年第十一届国赛-答疑|贪心

题目链接:

蓝桥杯2020年第十一届国赛真题-答疑 - C语言网 (dotcpp.com)

思路:

 这道题 计算的是时刻之和,写出这个时刻之和的计算式子,以下的si,ai的i为任意次序答疑的同学编号 ,不等于输入的顺序 
时刻之和=(0+s1+a1) + (s1+a1+e1 +s2+a2)+ (s1+a1+e1 +s2+a2+e2 +s3+a3)+.........+(前面n-1个同学的答疑时间+sn+an) 
发现总和即等于 s之和+a之和,加 n-1个前缀和
要使 这个总和最小, s之和+a之和是确定的,那么就要保证  n-1个前缀和最小 ,于是从小到大排序,得到的n-1个前缀和 是最小的 。

代码:

  1. //#include<iostream>
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. #define endl '\n'
  5. using namespace std;
  6. const int N=1e3+10;
  7. int n,ans=0;
  8. /*这道题 计算的是时刻之和,写出这个时刻之和的计算式子,以下的si,ai的i为任意次序答疑的同学编号 ,不等于输入的顺序
  9. 时刻之和=(0+s1+a1) + (s1+a1+e1 +s2+a2)+ (s1+a1+e1 +s2+a2+e2 +s3+a3)+.........+(前面n-1个同学的答疑时间+sn+an)
  10. 发现总和即等于 s之和+a之和,加 n-1个前缀和
  11. 要使 这个总和最小, s之和+a之和是确定的,那么就要保证 n-1个前缀和最小 ,于是从小到大排序,得到的n-1个前缀和 是最小的
  12. */
  13. int s,a,e;
  14. int su[N];
  15. void solve(){
  16. cin>>n;
  17. for(int i=1;i<=n;i++){
  18. cin>>s>>a>>e;
  19. su[i]=s+a+e;
  20. ans+=s+a;
  21. }
  22. //用sort函数的时候greater<int>后还有一对括号
  23. //注意第一个参数是起始位置,这里数组从1开始存的,要改成su+1
  24. sort(su+1,su+n+1,less<int>());
  25. for(int i=1;i<n;i++){
  26. su[i]=su[i-1]+su[i];
  27. ans+=su[i];
  28. }
  29. cout<<ans;
  30. }
  31. signed main() {
  32. cout.tie(0);
  33. cin.tie(0);
  34. solve();
  35. return 0;
  36. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/415880?site
推荐阅读
相关标签
  

闽ICP备14008679号