[luogu]P2123 皇后游戏
题目传送门
分析
和国王游戏一样的思路直接考虑邻项交换
观察易知排在后面的大臣获得的奖赏一定更多
假设前 位左手上的数和为,第 位获得奖赏为;
对于排在第 位和第 位的大臣,
交换前,最大收益
交换后,最大收益
为了使交换前收益最小需要满足 ,则有
所以只需要按这个规定贪心排序即可,个人认为传递性是存在的,手推了一下满足条件的所有情况,都没有矛盾(就是懒得用反证法)
但是没有考虑的是当 时应该如何排序
在一个相对的平衡里,如果我的某一方面属性在局面里有较大作用(比方说右手数字比你大,因为计算时最后直接加的右手数字)那么把我排在你前面才能使答案缩小,所以在这个平衡状态里我选择把右手数字大的排在前面。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define rg register
inline int read(){
rg int x = 0, f = 1;
rg char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return x * f;
}
const int N = 2e4 + 1;
struct minister{
int l, r;
bool operator <(minister b) const{
if (min(l, b.r) == min(r, b.l))
return l < b.l;
return min(l, b.r) < min(r, b.l);
}
/*int l, r, d;
bool operator < (minister b) const{
if (d != b.d) return d < b.d;
if (d < 0) return l < b.l;
else return r > b.r;
}*/
}a[N];
int n;
long long sum;
long long c[N];
inline void init(){
n = read();
for (int i(1); i <= n; ++i){
a[i].l = read(), a[i].r = read();
/* if (a[i].l > a[i].r) a[i].d = 1;
else if (a[i].l < a[i].r) a[i].d = -1;
else a[i].d = 0;*/
}
sum = 0;
}
inline void doit(){
sort(a + 1, a + 1 + n);
for (int i(1); i <= n; ++i){
sum += a[i].l;
c[i] = max(c[i - 1], sum) + a[i].r;
}
printf("%lld\n", c[n]);
}
int main(){
ios::sync_with_stdio(false);
cout.tie(NULL);
int T = read();
while (T--){
init();
doit();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)