【洛谷习题】皇后游戏
题目链接:https://www.luogu.org/problemnew/show/P2123
难度很大,这道题在洛谷上的题解也很少,所以严格意义上,我写的不算题解。
这道题,我的确做出来了,但没办法证明我做的是对的。
类似国王游戏,我们考虑两个大臣的顺序。这里我投机取巧,考虑了最特殊的开头两个大臣。
不难列出相应的式子,发现要是获得奖金最多的大臣获奖最少,两位大臣需要满足a1+b2+max(b1,a2)<a2+b1+max(b2,a1)。
根据题意,后面的大臣一定会比前面的大臣获奖多,所以按要求排序后,最后一个大臣获奖数就是答案。
还要注意用long long,这方面比国王游戏好多了,不用写烦人的高精度。
1 #include <cstdio> 2 #include <algorithm> 3 4 using namespace std; 5 6 typedef long long ll; 7 8 const int maxn = 2e4 + 5; 9 10 struct Minister { 11 ll a, b; 12 bool operator < (const Minister& rhs) { 13 return a + rhs.b + max(b, rhs.a) < rhs.a + b + max(rhs.b, a); 14 } 15 } minister[maxn]; 16 17 ll c[maxn]; 18 19 int main() { 20 int t, n; 21 scanf("%d", &t); 22 while (t--) { 23 scanf("%d", &n); 24 for (int i = 1; i <= n; ++i) 25 scanf("%lld%lld", &minister[i].a, &minister[i].b); 26 sort(minister + 1, minister + n + 1); 27 ll sum = 0; 28 for(int i = 1; i <= n; ++i) { 29 sum += minister[i].a; 30 c[i] = max(sum, c[i - 1]) + minister[i].b; 31 } 32 printf("%lld\n", c[n]); 33 } 34 return 0; 35 }