H. Hearthstone So Easy
分析:
-
博弈题(不知道算啥博弈)
-
可以发现:不管先后手如何操作,一轮回和结束之后(两者都活着)两者的血量都是一样的
-
考虑先手如何才能取胜:
- 先手必须要尽快扣死后手,不然拖到下一轮,先手抽卡阶段就有可能被扣死
- 故,先手最优解,会一直选择扣后手的血
-
考虑后手如何才能取胜:
-
后手不可能直接扣死先手,若存在这种情况,先手能更先扣死后手,故矛盾
因此,后手只能跟先手耗时间,等着某一回合结束的下一回合,先手抽卡阶段直接被扣死
-
故,后手只会在倒数第二轮扣先手血,然后到最后一轮先手抽卡阶段直接被扣死
其他回合,后手会一直奶自己
-
-
考虑先手在第m回合取胜,根据最优解来选择,则有以下不等式:
{ n − m ( m + 1 ) 2 > 0 ( 先 手 血 量 ) n − m ( m + 1 ) 2 − k < = 0 ( 后 手 血 量 , 第 m 回 合 还 没 来 及 奶 自 己 就 死 了 ) \begin{cases} n-\frac{m(m+1)}{2}>0\ (先手血量)\\ n-\frac{m(m+1)}{2}-k<=0\ (后手血量,第m回合还没来及奶自己就死了)\\ \end{cases} {n−2m(m+1)>0 (先手血量)n−2m(m+1)−k<=0 (后手血量,第m回合还没来及奶自己就死了)
(第 m m m 轮先手选择扣后手,后手没机会操作就没了)m ( m + 1 ) 2 \frac{m(m+1)}{2} 2m(m+1) 表示前 m m m 轮抽卡扣的血
-
但是这样考虑肯定不够,先手能进行第 m m m 轮操作有个大前提:
m − 1 m-1 m−1 轮,后手选择扣先手,然后在第 m m m 轮的抽卡阶段,先手不会直接被扣死
即 n − m ( m − 1 ) 2 − k − m > 0 n-\frac{m(m-1)}{2}-k-m>0 n−2m(m−1)−k−m>0 , 发现了没???
这个式子左半部分与后手血量一样,且矛盾了
故,先手没有在第一轮扣死后手,必败!!!
-
吐槽一下:比赛的时候也是误打误撞,就直接想着后手一直给自己加血,然后也推出来先手胜矛盾了
当时,愣了老半天没反应过来,验算了三遍,才反应过来矛盾就说明先手不能够必胜这个道理
#include <bits/stdc++.h>
using namespace std;
signed main()
{
int T;
cin>>T;
while(T--)
{
int n,k;
cin>>n>>k;
if(n==1) cout<<"freesin"<<endl; // 巨坑,边界,就离谱,多wa一发,还整得差点直接放弃了
else if(1+k>=n) cout<<"pllj"<<endl;
else cout<<"freesin"<<endl;
}
}