题意:
有一个数n,有两个人进行对这个数进行操作
有两种操作:
1.如果n大于1,n--,贡献++
2.如果n大于1,n/=2,贡献+=n/2
当有一个人不能操作就判负
问先手最大贡献是多少
思路:
这道题是模拟回合,d
当n%2==1时,只有一种决策:拿一颗石子
当n%2==0时:
1.当n/=2后仍为奇数,那么对方拿走一颗石子后我又可以重复操作,这样我获得的总是当前总数的一半,对方每轮只能拿1,因此这种情况是最优的
2.当n/=2后是偶数,那么如果拿一半,剩下的还是偶数,对方就能进行最优决策,决策后对方能够进行最优决策的决策一定不可能是最优决策,因此需要先一个个地拿,直到达到一种状态,满足n为偶数且n/2为奇数,这样就又可以进行最优决策
Code :
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,now=0,ans=0;
void solve(){
now=0;ans=0;
scanf("%lld",&n);
while(n){
if(n%2==1){
if(now==0){
ans++;
}
n--;
}else{
if(n==4||(n>4&&n%4!=0)){
if(now==0){
ans+=n/2;
}
n/=2;
}else{
if(now==0){
ans++;
}
n--;
}
}
now^=1;
}
printf("%lld\n",ans);
}
signed main(){
int T;
scanf("%lld",&T);
while(T--)solve();
return 0;
}
总结:
1.模拟回合的本质上是对局面状态进行一些分类讨论,然后执行最优决策
2.决策后对方能够进行最优决策的决策一定不可能是最优决策