题意:
p l l j pllj pllj 和 f r e e s i n freesin freesin 初始各拥有 n n n 滴血,每一回合由两个玩家先后进行,例如第 i i i 回合:
- 玩家先减去自身 i i i 滴血;
- 玩家选择自身血量 + k +k +k 或者 对方血量 − k -k −k;
给定 n n n 和 k k k , p l l j pllj pllj先手,双方都保持最优策略,求必胜方?
分析:
首先明确两点:
- 每一回合开始前,双方的血量是一致的;
- 同一回合中,先手干不掉后手,后手也无法在同回合干掉先手;
第一回合结束游戏的情况有:
- n = 1 n=1 n=1 :此时先手必败
- n < = k + 1 n<=k+1 n<=k+1 :此时后手必败,显然,先手扣完一点血后选择扣掉后手 k k k 点血,后手要么直接 G G GG GG,要么轮到后手了直接扣完最后一点再 G G GG GG ;
一回合结束不了游戏的话,我们假设第 i + 1 i+1 i+1 回合 先手终于可以干掉后手,那么第 i i i 回合显然先手还干不掉后手;
设第
i
+
1
i+1
i+1 回合开始之前双方血量为
H
H
H
则
H
H
H 的约束为:
-
H
>
i
+
1
H>i+1
H>i+1 且
H
<
=
k
+
i
+
1
H<=k+i+1
H<=k+i+1
意思是先手减去 i + 1 i+1 i+1 点血量,然后选择扣掉后手 k k k 点血,轮到后手再扣自身 i + 1 i+1 i+1 点血量,所以区间 ( i + 1 , k + i + 1 ] (i+1,k+i+1] (i+1,k+i+1] 内的血量,先手在第 i + 1 i+1 i+1 回合可以干掉后手;
设第
i
i
i 回合先手减去自身
i
i
i 滴血后剩余血量为
h
h
h
则
h
h
h 的约束为:
- h > k h>k h>k,显然 ,因为第 i i i 回合结束不了
再来枚举 h h h 的具体情况:
- h < = i + 1 h<=i+1 h<=i+1 ,先手必败(先手无论怎么操作,后手都可以让这回合结束剩余的血量 < = h <=h <=h)
-
h
>
i
+
1
h>i+1
h>i+1 ,
①:先手选择自身血量 + k +k +k ,则后手可以选择自身血量 + k +k +k ,则回合结束后血量
H 0 = h + k > i + 1 + k H_0=h+k>i+1+k H0=h+k>i+1+k ,不满足约束;
②:先手选择对方血量 − k -k −k 且 h − k < = i + 1 h-k<=i+1 h−k<=i+1 ,先手必败,显然后手可以让回合结束剩余的血量 < = i + 1 <=i+1 <=i+1 ;
③:先手选择对方血量 − k -k −k 且 h − k > i + 1 h-k>i+1 h−k>i+1 ,即 h > i + 1 + k h>i+1+k h>i+1+k ,后手可以选择自身血量 + k +k +k ,使得 H 1 = h > i + 1 + k H_1=h>i+1+k H1=h>i+1+k ,不满足约束;
综上所述,不存在 h h h 满足 H H H ,即不存在第 i + 1 i+1 i+1 回合 先手终于可以干掉后手,第 i i i 回合先手干不掉后手的情况,所以先手只能在第一回合干掉后手,否则后手必胜。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k,t;
cin>>t;
while(t--) {
cin>>n>>k;
if(n>1&&1+k>=n) cout<<"pllj";
else cout<<"freesin";
cout<<endl;
}
}