P8002 Alice and Bob are playing a Normal Game
题意
一开始有一个序列 ,记此时的 为 ,接下来有一个公开的非负整数操作序列 ,即 Alice 和 Bob 都知道。
接下来 Alice 和 Bob 交替操作一共 次,Alice 先,第 次操作为使 变为 。
Alice 希望最后的 最大,而 Bob 希望最后的 最小,在两人都采取最优策略的情况下,求出最后的 。
分析
乍一看好像是 剪枝,然而 的范围是过不了的。
于是我们考虑自己当一回 Alice & Bob 精神分裂:
- Alice:天助我也,Bob 什么都做不了,我只要使答案最大就可以了,。
- Alice:最后一次操作是 Bob 执行的,不论我这轮操作后 的大小如何,Bob 都可以通过 使最后的结果尽可能小,既然这样,我只要使 尽可能小就可以了,如果 ,显然可以使它变为 ,否则最小只能变成 了。
- Bob:我现在掌握着最后一轮的结果,要使答案尽可能小, 只要 ,无论如何答案都是最小的。
- Alice:最后一次操作是我执行的,那是我会使 ,所以我只要使 尽可能大就好了,。
- Bob:局势对 Alice 十分有利,她最后得到的答案与 有关,所以我还是要使其尽可能小,如果 ,显然可以使它变为 ,否则最小只能变成 了。
- Alice:该做什么就显而易见了,。
不难发现,Alice 和 Bob 所做的举动和 的奇偶性有关:
- :Alice 每次使 最大,Bob 每次使 最小。
- :Alice 每次使 最小,Bob 每次使 最大。
于是按题意模拟即可,时间复杂度 ,空间复杂度 。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
long long x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void write(long long x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
const int N=2e5+10;
int n,k;
ll ans,x;
ll minabs(ll a,ll b){//ans绝对值的最小值
if(abs(a)<=b)
return 0;
return abs(a)-b;
}
int main(){
n=read();k=read();
for(int i=1;i<=n;i++)
ans+=(read()*(i%2?1:-1));
if(k%2)
for(int i=1;i<=k;i++){
x=read();
if(i%2)
ans=x+abs(ans);
else
ans=minabs(ans,x);
}
else
for(int i=1;i<=k;i++){
x=read();
if(i%2)
ans=minabs(ans,x);
else
ans=-x-abs(ans);
}
write(ans);
return 0;
}
本文作者:luckydrawbox
本文链接:https://www.cnblogs.com/luckydrawbox/p/18526568
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步