网站开发的教学视频,深圳今天发生的重大新闻,做英语听力音频的网站,网站套用P1288 取数游戏II
题意#xff1a;
一个环#xff0c;由边权#xff0c;硬币一开始在一个点上#xff0c;两个人轮流操作#xff0c;每次操作向左或右移动#xff0c;每次移动必须将边权减少到非负整数#xff0c;如果原本是0则不能走#xff0c;当不能走动时#x…P1288 取数游戏II
题意
一个环由边权硬币一开始在一个点上两个人轮流操作每次操作向左或右移动每次移动必须将边权减少到非负整数如果原本是0则不能走当不能走动时该方输掉比赛 问先手是否右必胜策略 题目保证至少有个边为0
题解
构造SG函数当前节点和0边之间的边数%2奇数边sg1为必胜局面偶数条边sg0为必败局面 终局为必败局面必胜可以走到必败局面奇-偶必败不能到必败局面无法奇-奇 有奇数条边则必胜否则必败 怎么理解 对于一条链(环的问题一般都要链化)a1,a2,a3…0如果到是偶数个边(末尾为0)那么先手一定赢因为先手可以将a1剪成0后手无法返回只能继续走不管后手怎么走先手都可以再将a3减成0到达a4因为是偶数个边随意最后后手正好被卡在两个0之间输掉游戏 反过来如果是奇数个先后不管怎么走先走一部后对于后手还有偶数个边可以走按照上面讲的后手必胜 注意题目是个环所以还要顺逆时针两个方向看
代码
#includecstdio
#includecstring
#includeiostream
using namespace std;
int n,a[25];
int main(){scanf(%d,n);for(int i1;in;i)scanf(%d,ai);for(int i1;in;i)//顺时针看 if(a[i]0){//如果到0有偶数个边先手必胜 if(i%20)return puts(YES),0;break;}for(int in;i1;i--)//逆时针看 if(a[i]0){//if((n-i1)%20)return puts(YES),0;break;}puts(NO);return 0;
}