Time Limit: 1000 ms Memory Limit: 65536 KiB
Special Judge
Problem Description
“石头、剪刀、布”是猜拳的一种,两人玩,起源于中国,然后传到日本、韩国等地,随着亚欧贸易的不断发展传到了欧洲,到了近现代逐渐发展到世界。
游戏规则中,石头克剪刀,剪刀克布,布克石头。
现在山东理工大学ACM集训队打算举行一场石头剪刀布锦标赛。比赛采取 100 局胜负制。
由于参赛选手过多,比赛决定采取初赛+决赛的方式决出最后的冠军。其中初赛每个人都要先和集训队开发的智能猜拳机器人阿尔法猫进行比赛,100局比赛中只要你获胜局数达到98局及以上即可获得胜利。
作为初代机器人,阿尔法猫的比赛策略是固定的。它的策略具体如下:
它会根据对方之前已经出过的石头次数、剪刀次数、布次数,来发出最不利于对方的操作。比如对方剪刀最多,它一定会出石头;对方布最多,它一定会出剪刀;对方石头最多,它一定会出布。
在比赛开始前,科学家blue长者会首先给它设定一个比赛策略,即给石头,剪刀,布各分配一个优先级,分别为 p,q,r。如果存在两个一样多,或三个一样多,或者一个都没出过(刚开局),那么它会优先选择优先级高的。比如说假如对方出过的剪刀和布一样多,石头比较少的话,那么它接下来的选择一定在石头和剪刀之间。如果石头的优先级为 3,剪刀的优先级为 2,那么它就会优先选择石头。
由于机器人只会依照既定策略进行操作也就是说,一旦你得到了机器人所执行的策略,也就是机器人在比赛中三种方式的优先级 p,q,r,那么这么100局比赛你肯定能全部获胜。(题目保证给出的三个优先级互不相同)
现在假定你足够聪明,请你编写程序战胜机器人进入猜拳决赛。
Input
有且仅有一行,三个整数 p,q,r 分别代表石头,剪刀和布的优先级,用空格隔开。
Output
首先输出一行,将刚输入的p,q,r再输出一遍,三个数之间用空格隔开。
接着输出 100 行,每行一个整数,依次为这 100 局你的选择。
石头输出 1,剪刀输出 2,布输出 3。
Sample Input
本题无样例输入
Sample Output
本题无样例输出
Hint
Source
改编
#include <iostream>
#include <cstdio>
using namespace std;
int shitou = 1, jiandao = 2,baofu = 3;
int a, b, c;
int ca, cb, cc;
//统计已出的猜拳
void chct(int a)
{
if(a == 1)
ca++;
if(a== 2)
cb++;
if(a == 3)
cc++;
}
//得到当前最大数量
int getMaxCount()
{
int m, t;
m = ca;
t = 1;
if(cb > m)
{
m = cb;
t = 2;
}
if(cc > m)
{
m = cc;
t = 3;
}
return t;
}
//得到当前最高优先级
int getmax()
{
int m, t;
m = a;
t = 1;
if(b > m)
{
m = b;
t = 2;
}
if(c > m)
{
m = c;
t = 3;
}
return t;
}
//根据机器人所出得到自己的猜拳
int getown(int x)
{
if(x == 1)
return 3;
else if(x == 2)
return 1;
else
return 2;
}
//根据猜拳得到优先级
int getPriority(int x)
{
if(x == 1)
return a;
if(x == 2)
return b;
else
return c;
}
//返回机器人要出的猜拳
int judge()
{
//判断数量是否相等
if(ca == cb && ca == cc)
{
int robot = getmax();
return robot;
}
else if(ca == cb && cc < ca)
{
int xa, xb;
//获得机器人可能猜拳
xa = getown(shitou);
xb = getown(jiandao);
//
if(getPriority(xa) > getPriority(xb))
{
return xa;
}
else
{
return xb;
}
}
else if(ca == cc && cb < ca)
{
int xa, xb;
//获得机器人可能猜拳
xa = getown(shitou);
xb = getown(baofu);
//
if(getPriority(a) > getPriority(b))
{
return xa;
}
else
{
return xb;
}
}
else if(cb == cc && ca < cb)
{
int xa, xb;
//获得机器人可能猜拳
xa = getown(baofu);
xb = getown(jiandao);
if(getPriority(xa) > getPriority(xb))
{
return xa;
}
else
{
return xb;
}
}
else
{
//不存在相等的情况
int person;
person = getMaxCount();
int tp = getown(person);
return tp;
}
}
int main()
{
cin >> a >> b >> c;
cout << a << " " << b << " " << c<<endl;
ca = cb = cc = 0;
//第一局
int t = getmax();
int man= getown(t);
cout << man << endl;
chct(man);
for(int i = 2; i <= 100; i++)
{
int robot = judge();
int man = getown(robot);
chct(man);
if(i == 100)
cout << man;
else
cout << man << endl;
}
return 0;
}