首页 > 其他分享 >[luogu]P2123 皇后游戏

[luogu]P2123 皇后游戏

时间:2023-01-09 22:13:38浏览次数:59  
标签:游戏 min int luogu sum long P2123 max include

题目传送门

分析

和国王游戏一样的思路直接考虑邻项交换
观察易知排在后面的大臣获得的奖赏一定更多
假设前 \(i - 1\) 位左手上的数和为\(a\),第 \(i - 1\) 位获得奖赏为\(c_{i - 1}\);
对于排在第 \(i\) 位和第 \(i + 1\) 位的大臣,
交换前,最大收益

\[w1 = max(c_i,\sum_{j=1}^{i+1}a_j)+b_{i+1}=…… \\=max(c_{i-1}+b_i+b_{i+1},\sum_{j=1}^ia_j+b_i+b_{i+1},\sum_{j=1}^{i+1}a_j+b_{i+1}) \]

交换后,最大收益

\[w2 = max(max(c_{i-1},\sum_{j=1}^{i-1}a_j+a_{i+1})+b_{i+1},\sum_{j=1}^{i+1}a_j)+b_i=…… \\=max(c_{i-1}+b_i+b_{i+1},\sum_{j=1}^{i-1}a_j+a_{i+1}+b_i+b_{i+1},\sum_{j=1}^{i+1}a_j+b_{i}) \]

为了使交换前收益最小需要满足 \(w1 < w2\) ,则有

\[max(\sum_{j=1}^ia_j+b_i+b_{i+1},\sum_{j=1}^{i+1}a_j+b_{i+1})<max(\sum_{j=1}^{i-1}a_j+a_{i+1}+b_i+b_{i+1},\sum_{j=1}^{i+1}a_j+b_{i})\\max(a_i+b_i+b_{i+1},a_i+a_{i+1}+b_{i+1})<max(b_i+b_{i+1}+a_{i+1},a_i+b_i+a_{i+1})\\max(b_i,a_{i+1})+a_i+b_{i+1}<max(b_{i+1},a_i)+b_i+a_{i+1}\\max(-a_{i+1},-b_i)<max(-a_i,-b_{i+1})\\min(a_{i+1},b_i)>min(a_i,b_{i+1})\\min(a_i,b_{i+1})<min(a_{i+1},b_i) \]

所以只需要按这个规定贪心排序即可,个人认为传递性是存在的,手推了一下满足条件的所有情况,都没有矛盾(就是懒得用反证法)
但是没有考虑的是当 \(min(a_i,b_{i+1})=min(a_{i+1},b_i)\) 时应该如何排序
在一个相对的平衡里,如果我的某一方面属性在局面里有较大作用(比方说右手数字比你大,因为计算时最后直接加的右手数字)那么把我排在你前面才能使答案缩小,所以在这个平衡状态里我选择把右手数字大的排在前面。

代码

#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;
}

标签:游戏,min,int,luogu,sum,long,P2123,max,include
From: https://www.cnblogs.com/cancers/p/17038663.html

相关文章

  • luogu P1971 [NOI2011] 兔兔与蛋蛋游戏
    题面传送门没想到二分图博弈这么早就考了?首先我们发现,如果将和起点行列之和奇偶性一样的点设为黑色,其余设为白色,那么每次空格只会在异色边之间走,而不会在同色边之间走。......
  • 堆叠大陆 Stacklands for Mac(卡牌游戏) v1.1.6中文原生版
    Stacklands中文名《堆叠大陆》又名《堆叠世界》《层叠世界》,是一款可以在mac上运行的村庄建设卡牌游戏,你可以在那里堆叠卡牌以收集食物、修建建筑、并与各种生物战斗。游戏......
  • 「博弈&位运算」投票游戏
    本题为1月7日22寒假集训每日一题题解题目来源:(未知)题面题目描述信奥班的同学总是这么无聊,他们现在喜欢玩一种投票游戏。游戏规则如下,把参与游戏的同学们编号由1到......
  • Luogu P4592 [TJOI2018]异或 做题记录
    随机跳的。树上维护序列,显然树剖。维护异或,显然01trie。01trie维护区间异或,显然可持久化一下。看到时限很大,显然可以双log。于是跑一边树剖,再根据id暴力建一个可......
  • 关于如何学好游戏3D引擎编程的一些经验
    ​ 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术的最高峰        ——阿哲VS自己QQ79......
  • 分享用Adobe Air向iOS移植游戏的经验
    分享用AdobeAir向iOS移植游戏的经验​​http://gamerboom.com/archives/47931​​发布时间:2012-02-2117:04:42Tags:​​AdobeAir​​​,​​​iOS移植游......
  • luogu P5037 抓捕
    ##题意有$n$个点的图,任意一点$x$到可去另外一点$y$必须互质,即$\gcd(x,y)=1$。图无边权,但是拥有点权。求到终点$en$的最短距离。---##思路此题需使用Dijks......
  • Luogu P4591 [TJOI2018] 碱基序列
    链接难度:\(\texttt{省选/NOI-}\)有\(k\)组,每一组有\(a_i\)个字符串\(t_{k,a_i}\),询问分别在每一组选一个字符串拼成的字符串在文本串\(s\)出现的个数的所有情况......
  • Python小游戏(1)
    name=str(input('请输入姓名:'))age=int(input('请输入真实年龄:'))ifage>=18:print(f'恭喜{name}可以在网上冲浪了。')else:print('小小年纪不学好,赶紧回......
  • 简单的24点小游戏
    简单的24点小游戏游戏规则随机生成4个数字(1-10),通过+-*/四则运算将4个数字算出24即可游戏设计生成4个数字,并给出参考答案随机生成0-10之间的4个整数穷举4个数所......