Codeforces Round #109 (Div. 1) D Flatland Fencing
题目链接:Flatland Fencing
题意:有两个人参加游戏,开始时在坐标轴的x1,x2处,第一个玩家每次可以走到 [x1+a, x1+b]处,第二个玩家每次可以走到 [x2-b, x2-a] 处,当某一方走到另一方当前所站的位置时为胜。问两者都采取最佳策略,则谁胜谁负或者平局。
题解:双方的策略是对称的,所以在很多情况下第二个玩家总能够采取与第一个玩家对称的策略抵消对方的优势,已达到平局。
如果玩家可以留在原地,则一定是平局。如果玩家双方只能朝着相反的方向走的时候也一定是平局。
剩下的情况可以看成有 |x1-x2| 颗石子,每次至少取 min(|a|, |b|),最多取 max(|a|, |b|)颗石子,刚好取到 0 的玩家胜利:这里也需要注意平局,令最少取 a,最多取 b,总数为 n,则 n%(a+b) 在 [1, a-1]∪[b+1, a+b-1] 时一定时平局;其他时候只有当 n%(a+b) == 0 时,第二个玩家才能胜利,否则第一个玩家胜利。
#include <bits/stdc++.h> using namespace std; typedef long long LL; void solve(LL n,LL a,LL b,LL x1,LL flag){ if(((n%(a+b))<=a-1&&(n%(a+b))>=1)||(b+1<=(n%(a+b))&&(n%(a+b))<=a+b-1)) cout<<"DRAW"<<endl; else{ if(n%(a+b)==0) cout<<"SECOND"<<endl; else if(flag==0){ cout<<"FIRST"<<endl; cout<<x1-n%(a+b)<<endl; } else{ cout<<"FIRST"<<endl; cout<<x1+n%(a+b)<<endl; } } } int main(){ LL x1,x2,a,b; cin>>x1>>x2>>a>>b; if(a<=0&&b>=0){ if(x1+a<=x2&&x2<=x1+b){ cout<<"FIRST"<<endl; cout<<x2<<endl; } else{ cout<<"DRAW"<<endl; } } else if(a<0&&b<0){ if(x1-x2<0) cout<<"DRAW"<<endl; else{ solve(abs(x1-x2),abs(b),abs(a),x1,0); } } else if(a>0&&b>0){ if(x1-x2>0) cout<<"DRAW"<<endl; else{ solve(abs(x1-x2),abs(a),abs(b),x1,1); } } return 0; }