Codeforces976E Well played! 【贪心】

秒速五厘米 2021-10-01 02:34 315阅读 0赞

题目分析:

  由于乘二的收获很大,所以我们可以证明乘的数一定是同一个,接着排序后依次选取,判断一下即可。

题目代码:

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3
  4. 4 const int maxn = 320000;
  5. 5
  6. 6 int n,a,b;
  7. 7
  8. 8 struct node{
  9. 9 int hp,dm;
  10. 10 }d[maxn];
  11. 11
  12. 12 int cmp(node alpha,node beta){
  13. 13 return alpha.hp-alpha.dm > beta.hp-beta.dm;
  14. 14 }
  15. 15
  16. 16 void read(){
  17. 17 scanf("%d%d%d",&n,&a,&b);
  18. 18 for(int i=1;i<=n;i++) scanf("%d%d",&d[i].hp,&d[i].dm);
  19. 19 sort(d+1,d+n+1,cmp);
  20. 20 }
  21. 21
  22. 22 void work(){
  23. 23 int hh = 1;
  24. 24 long long ext = 0,ans = 0;
  25. 25 for(int i=1;i<=a;i++) hh *= 2;
  26. 26 int pt;
  27. 27 for(pt=1;pt<=min(b,n);pt++){
  28. 28 if(d[pt].hp-d[pt].dm <= 0) break;
  29. 29 ans += d[pt].hp;
  30. 30 }
  31. 31 for(int i=pt;i<=n;i++) ans += d[i].dm;
  32. 32 long long em = ans;ext = ans;pt--;
  33. 33 if(b == 0){printf("%lld",ext);return;}
  34. 34 for(int i=1;i<=n;i++){
  35. 35 em = ans;
  36. 36 if(i<=pt){
  37. 37 em = em-d[i].hp+(1ll*d[i].hp*hh);
  38. 38 ext = max(ext,em);
  39. 39 }else{
  40. 40 if(pt < b){
  41. 41 em = em+(1ll*d[i].hp*hh)-d[i].dm;
  42. 42 ext = max(ext,em);
  43. 43 }else{
  44. 44 em = em-d[pt].hp+(1ll*d[i].hp*hh)-d[i].dm+d[pt].dm;
  45. 45 ext = max(ext,em);
  46. 46 }
  47. 47 }
  48. 48 }
  49. 49 printf("%lld",ext);
  50. 50 }
  51. 51
  52. 52 int main(){
  53. 53 read();
  54. 54 work();
  55. 55 return 0;
  56. 56 }

转载于:https://www.cnblogs.com/Menhera/p/8982499.html

发表评论

表情:
评论列表 (有 0 条评论,315人围观)

还没有评论,来说两句吧...

相关阅读

    相关 CodeForces1154E

    [CodeForces1154E][] 题意就是有两个教练,每个教练轮流操作,每次操作会选取所有未被选取的学生中能力值最高的那一个并把这个学生向左向右各\\(k\\)个学生

    相关 Codeforces 353E 贪心

    题意:给你一张有向图,第i条边连接i号点和(i + 1) % n号点,问最多可以选择多少个点,使得这些点互相不可达。 思路:容易发现,如果某个边的集合点的数目大于等于2,那么