輸入樣例:
2
10 9
5 3
輸出樣例
pllj
freesin
題目大意:
本題講的是爐石傳說抽卡游戲,每一輪的游戲流程為:玩家1抽牌?玩家1打牌?玩家2抽牌?玩家2打牌,
游戲規則:
1、在每個玩家的抽牌階段,玩家嘗試從他或她的牌庫中抽一張牌,
2、在每個玩家的游戲階段,玩家可以選擇:
通過k點增加他/她的血量, (血量沒有上限)
通過k點減少對手的血量,
當玩家的卡組中沒有卡牌時,玩家會進入疲勞狀態, 此時,玩家每抽一張牌,疲勞值就會增加 1,然后根據疲勞值扣除生命值, 每個玩家的疲勞值初始為 0 點,
pllj 和 freesin 非常喜歡玩爐石, 在某場比賽中,雙方的牌庫中都沒有牌,疲勞點數均為0點,血量點數均為n點, 當玩家的生命值小于或等于0時,玩家立即輸掉游戲,
這時候輪到pllj抽牌了, 兩個玩家都非常聰明,所以他們以最佳方式玩游戲, 誰將是最后贏家?請輸出他的名字,
解題思路:
- n ,k 取值這么大, 10的9次方,肯定不可能遞回暴力做,肯定是有規律可尋,
- 如果 A 第一回合被扣血死,那么 B 贏;
- 如果 A 第一回合能打死 B,或者使 B 只剩一點血,那么 A 贏;
- 其他情況 B 贏,
證明:
首先情況 1 和情況 2 顯然,由題目我們可以知道一條重要的資訊:每回合開始時,A 和 B 的血量必定是相同的,我們考慮在第 i + 1, (i > 0) 回合 A 剛好可以擊殺 B,即在第 i 回合 A 無法擊殺 B,那么在第 i 回合 B一定可以擊殺 A,所以只要 A 第一回合無法擊殺 B,那么 B 一定贏,注意特判初始血量為 1 的情況,
實作代碼:
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin>>t;
while (t--) {
int n,k;
cin>>n>>k;
if(n==1){
cout<<"freesin"<<endl;
continue;
};
if(n <= k+1) {
cout<<"pllj"<<endl;
} else {
cout<<"freesin"<<endl;
}
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340951.html
標籤:其他
