标签:实现 while 选择 get log cto 最优 code title
思路:
参考了http://codeforces.com/blog/entry/59195。
可以证明在最优解中所有的第一种操作都是施加同一个物种上的。那么首先按照hp - dmg对所有物种降序排序,贪心选择前b个进行第二种(赋值)操作。然后枚举所有物种,选择一个进行第一种操作,在所有情况中取最大值。
在选择一个物种进行第一种操作的时候,不要按照(hp << a) - dmg贪心,反例:
3 1 2
20 10
5 1
25 25
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef pair<ll, ll> pll; 5 6 const int MAXN = 200005; 7 const ll INF = 0x3f3f3f3f3f3f3f3f; 8 9 vector<pll> v; 10 11 bool cmp(pll & x, pll & y) 12 { 13 return x.first - x.second > y.first - y.second; 14 } 15 16 int main() 17 { 18 int n, a, b; 19 while (cin >> n >> a >> b) 20 { 21 v.resize(n); 22 ll ans = 0; 23 for (int i = 0; i < n; i++) 24 { 25 cin >> v[i].first >> v[i].second; 26 ans += v[i].second; 27 } 28 if (!b) { cout << ans << endl; continue; } 29 sort(v.begin(), v.end(), cmp); 30 int i = 0; 31 for ( ; i < v.size(); i++) 32 { 33 if (v[i].first <= v[i].second) break; 34 } 35 int pos = min(n, min(i, b)); 36 ans = 0; 37 for (int i = 0; i < pos; i++) ans += v[i].first; 38 for (int i = pos; i < n; i++) ans += v[i].second; 39 ll maxn = ans; 40 for (int i = 0; i < n; i++) 41 { 42 if (i < pos) 43 { 44 ll tmp = ans - v[i].first + (v[i].first << a); 45 if (tmp > maxn) maxn = tmp; 46 } 47 else 48 { 49 ll tmp = ans - v[i].second + (v[i].first << a); 50 if (pos && pos == b) tmp += - v[pos - 1].first + v[pos - 1].second; 51 if (tmp > maxn) maxn = tmp; 52 } 53 } 54 cout << maxn << endl; 55 } 56 return 0; 57 }
标签:实现 while 选择 get log cto 最优 code title
原文地址:https://www.cnblogs.com/wangyiming/p/9060966.html