C. Ultimate Value,出自Codeforces Round 1049 (Div. 2)
题目链接:https://codeforces.com/problemset/problem/2140/C
解题思路:博弈论一定要找出博弈在哪里。博弈的思想往往是简单的,只需要考虑最近一步就可以了。我一开始是想A有轮椅打法就是同奇偶位置交换它是净赚的,B就得选择最佳的位置交换了。但是多想一步,B即便选了收益最大的交换方式,A可以把它换回来,这样A还是净赚的。所以B只能选择终止。这样问题就只有A一步的操作了。我们要找到A的第一步最佳策略。就是看是2(a
l−ar)+r−l或者反过来谁最大。这种由两个组成的重要解题方法是:先找一半最大的和另一半最大的。然后二者再分别对对方循环来一遍 ,就可以从o(n2)降到o(n)了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+2;
int a[N],mn[N],mx[N];
signed main(){
int t;cin>>t;
while(t--){
int n;cin>>n;int sum=0;
for(int i=1; i<=n; i++){
cin>>a[i];
sum+=(i%2)?a[i]:-a[i];
if(i==1) mn[1]=1+2*a[1];
else if(i%2) mn[i]=min(mn[i-2],i+2*a[i]);
else mx[i]=max(mx[i-2],2*a[i]-i);
}
// r 奇 l 偶,2a_l-l-2a_r+r
// r 偶 l 奇,2a_r+r-2a_l-l
int ans=n-2+(n%2);
for(int i=1; i<=n; i++){
if(i%2) ans=max(ans,mx[i-1]-2*a[i]+i);
else ans=max(ans,2*a[i]-mn[i-1]+i);
}
cout<<ans+sum<<"\n";
}
return 0;
}

浙公网安备 33010602011771号