对于后手,最优的方案是,每次 后手选择与先手相反的操作,这样点最终将会在对角线上,如果不能继续走,就后手胜利,否则先手胜利;
接下来只需要二分对角线上的最大距离,求出最大多少个k,再判断是否还能走下一步。
#include<bits/stdc++.h> typedef unsigned long long ull; typedef long long ll; using namespace std; const int N = 1 << 19; const int mod = 1e9 + 7; /** * 不要使用#define int long long * 不开long long见祖宗 * ----YuFei Zhou */ void solve() { ll d,k; cin>>d>>k; ll l = 0,r = d; while (l < r){ //二分找到对角线上的最大的距离(整数) ll mid = (l+r+1) >> 1; if(mid*mid*2 <= d*d) { l = mid; }else{ r = mid - 1; } } ll ans = (l/k) * k;//计算最大对角线上最大举例为多少个k if(ans*ans + (ans+k)*(ans+k) <= d*d){ //如果还能走一步就是后手赢,否则先手赢 cout<<"Parry"; } else{ cout<<"Mercedes"; } cout<<endl; } int main(){ ios::sync_with_stdio(false); cin.tie(NULL),cout.tie(NULL); int t = 1; cin>>t; while(t--){ solve();//1 2 3 4 5 } return 0 ; }