Codeforces976E Well played! 【贪心】

题目分析:

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

题目代码:

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