传送门:http://codeforces.com/contest/976/problem/E
参考:https://www.cnblogs.com/void-f/p/8978658.html
题意:
对于每一个生物,有一个ph值和伤害值。现在有a次使ph值乘2的机会,有b次是伤害值等于ph值得机会。
问最后能得到最大的伤害总和是多少。
思路:自己一开始也想的是贪心,但是贪的姿势不正确。明确,a次一定是给同一个生物放大的。但是至于是对哪一个生物放大,还是要用暴力一个一个去找,而不要对排序后第一个值操作;
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <vector> #include <map> #include <set> #include <queue> #include <list> #include <iterator> #include <cmath> using namespace std; #define lson (l , mid , rt << 1) #define rson (mid + 1 , r , rt << 1 | 1) #define debug(x) cerr << #x << " = " << x << "\n"; #define pb push_back #define Pll pair<ll,ll> #define Pii pair<int,int> #define fi first #define se second #define OKC ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) typedef long long ll; typedef unsigned long long ull; /*-----------------show time----------------*/ const int maxn = 2e5+9; int a,b,n; struct node { ll h,d; ll w; }t[maxn]; const ll inf = 0x3f3f3f3f3f3f3f3f; int main(){ OKC; cin>>n>>a>>b; for(int i=1; i<=n; i++) { cin>>t[i].h>>t[i].d; t[i].w = t[i].h - t[i].d; if(t[i].w<0)t[i].w = 0; } ll sum = 0; sort(t+1,t+1+n,[](node a,node b){return a.w>b.w;}); for(int i=1; i<=n; i++) { if(i<=b)sum += max (t[i].h,t[i].d); else sum += t[i].d; } ll ans = sum; if(b==0)cout<<ans<<endl; else { for(int i=1; i<=n; i++) { ll tmp = sum; if(i<=b) { tmp -= max(t[i].h,t[i].d); tmp += 1ll*(t[i].h<<a); } else { tmp -= t[i].d; tmp += 1ll*(t[i].h<<a); tmp += t[b].d; tmp -= max(t[b].d,t[b].h); } if(ans<tmp)ans = tmp; } cout<<ans<<endl; } return 0; }