单点时限: 1.0 sec
内存限制: 256 MB
现在有一种石头剪刀布锦标赛。采取 100 局胜负制。对战 100 局,扣掉平局,谁赢得多谁就取得最终的胜利。
zzz 同学天天玩石头剪刀布,从而总结出了一套提高石头剪刀布胜率的方法。这套方法重点在于利用人的心理。石头剪刀布这三者,你可能觉得你是随机选择的,但其实不然。你还是会产生一定的偏向性。在若干局游戏后,有的人出石头的频数会高,有的人出布的频数会高,还有的人出剪刀的频数会高。
这点差异其实微乎其微,但却能成为决定胜负的关键。zzz 同学也就是靠着这微乎其微的差异,拿到了石头剪刀布世界冠军,攀上人生巅峰。
作为 zzz 同学的室友,你对 zzz 同学出石头剪刀布的套路掌握得一清二楚。具体如下:
他会根据对方之前已经出过的石头次数、剪刀次数、布次数,来决定最不利于对方的。比如对方剪刀最多,他一定会出石头;对方布最多,他一定会出剪刀;对方石头最多,他一定会出布。
在比赛开始前,他会给石头剪刀布各分配一个优先级,分别为 p,q,r。如果存在两个一样多,或三个一样多,或者一个都没出过(刚开局),那么他会优先选择优先级高的。比如说对方出过的剪刀和布一样多,石头就比较少,那么他接下来的选择一定在石头和剪刀之间。如果石头的优先级为 3,剪刀的优先级为 2,那么他就会优先选择石头。
zzz 同学是很死板的,他肯定不会违背这套策略。也就是说,一旦你搞到了他即将参加的比赛的优先级 p,q,r,你基本已经赢了,甚至连这 100 局每局是输是赢都想好了。
于是你膨胀了。你要去挑战世界冠军 zzz。
输入格式
有且仅有一行,三个整数 p,q,r ({p,q,r}={1,2,3}),用空格隔开。
不会有两个相同的测试点。
输出格式
输出 100 行,每行一个整数,依次为这 100 局你的选择。
石头输出 1,剪刀输出 2,布输出 3。
提示
此题无样例。
思路一:第一局可以根据对方的优先权获胜一局,第二局对方根据第一局你出的拳,确定出拳,这一局你又可以获胜,第三局你不论对方出什么,你都出前两个没出的。这样三局两胜,你出石头剪刀布的频率一样。这时对方又要根据优先级出拳,三局一循环。最终三局两胜。
思路二:第一局可以根据对方的优先权获胜一局,第二局对方根据第一局你出的拳,确定出拳,这一局你又可以获胜。那么第三局对方判断有两个频率一样的,根据优先级出拳必定又会出和第一局出拳一样,两局一循环,局局你赢。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int q,p,r;
cin>>q>>p>>r;
int flag[2];
int M=max(max(q,p),r);
if(M==q)//石头
{
flag[0]=3;
flag[1]=1;
//或者加入flag[2]=0;
}
if(M==p)//剪刀
{
flag[0]=1;
flag[1]=2;
//或者加入flag[2]=3;
}
else//布
{
flag[0]=2;
flag[1]=3;
//或者加入flag[2]=1;
}
for(int i = 0; i < 50;i++)
{
cout<<flag[0]<<endl;
cout<<flag[1]<<endl;
}
return 0;
}