D. Circle Game 題解(對稱博弈)


題目鏈接

題目大意

t組數據(t<=100)

給你一個半徑d和步數k,你最開始在原點(0,0)每次可以讓x坐標增加k,或者y坐標增加k

兩人輪流走,求誰最后不能走了,誰就輸了,都是最優博弈

輸的條件為下次走的坐標(x,y)都滿足\(x^2+y^2>d^2\)

題目思路

就是一個對稱博弈

求最遠的到達的(kz,kz)使得\((kz)^2+(kz)^2<=d^2\)

如果\((kz)^2+(kz+k)^2<=d^2\) 則先手勝,否則后手勝

因為后手一定有辦法使得坐標變為(kz,kz),而這個點若不能走,則后手勝

若這個點能走,則先手一定可以到底(kz,kz+k)則這個點可以走的點為(kz+k,kz+k)和(kz,kz+2k)

顯然都已經出界,則先手勝

代碼

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=400+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-5;
ll d,k;
int main(){
    int _; scanf("%d",&_);
    while(_--){
        cin>>d>>k;
        ll x=0;
        while((x+k)*(x+k)+(x+k)*(x+k)<=d*d){
            x+=k;
        }
        if((x+k)*(x+k)+x*x<=d*d){
            printf("Ashish\n");
        }else{
            printf("Utkarsh\n");
        }
    }
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM