现在一共有N个人(分别记为1, 2, …, N)在玩剪刀石头布,如果知道他们每个人都出了什么,你能找出来谁是winner吗?
当且仅当一个人可以赢其他所有人时,才称这个人是winner。
我们将剪刀记作2,石头记作0,布记作5,那么胜负关系就应当是2能赢5,5能赢0,0能赢2。
输入数据的第一行包含一个整数T ( 1 <= T <= 150),表示接下来一共有T组测试数据。
每组测试数据的第一行包含一个整数N (2 <= N <= 100000)表示一共有N个人在玩剪刀石头布,接下来一行一共有N个数,每个数均为0、2或5中的某一个,依次描述了这N个人分别出了什么,其中第i个整数描述了第i个人出了什么。
对于每组数据,用一行输出一个整数表示winner是第几个人([1, N]中的某个整数)。
如果不存在winner,则用一行输出“No winner”(不包括引号)。
3
3
5 5 2
3
2 0 0
3
0 2 5
Sample Output
3
No winner
No winner
原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1202
只要看明白了题目,真的没有什么可难的。接下来我们就来分析一下吧。由题目 ‘胜负关系就应当是2能赢5,5能赢0,0能赢2’ 可知,这是一个环,所以赢家出的必须跟所有人都不一样,而且除了赢家之外的所有人出的都一样。
那么接下来我们来看代码吧!
#include <stdio.h>
int aa[100001];
int main()
{
int t, n, i, j;
int a, b, c; //a,b,c分别用于统计出石头,出剪刀,出布的人数
int ax, bx, cx; //ax,bx,cx分别用于记下出石头,出剪刀,出布的是第几个人
scanf("%d",&t);
for(i=0; i<t; i++) //t组数据
{
scanf("%d",&n);
a=0, b=0, c=0;
for(j=0;j<n ; j++) //有n个人
{
scanf("%d",&aa[j]); //分别记下第j+1个人出的什么
if(aa[j]==0) //如果出的是石头,则记下出石头的人的位置,且用a统计这是第几个人出
{
ax=j+1;
a++;
}
else if(aa[j]==2)
//如果出的是剪刀,则记下出剪刀的人的位置,且用b统计这是第几个人出
{
bx=j+1;
b++;
}
else
//如果出的是布,则记下出布的人的位置,且用c统计这是第几个人出
{
cx=j+1;
c++;
}
}
if(a==1 && b==n-1) //如果只有一个人出石头且其他人都出剪刀,则这个人赢了,输出他的位置,表示是第几个人赢了
printf("%d\n",ax);
else if(b==1 && c==n-1) //如果只有一个人出了剪刀且其他人都出布,则这个人赢了,输出他的位置
printf("%d\n",bx);
else if(c==1 && a==n-1) //如果只有一个人出了布且其他人都出石头,则这个人赢了,输出他的位置
printf("%d\n",cx);
else
printf("No winner\n"); //其他情况都是没有赢家
}
return 0;
}
这下看懂了吧,只要分析清楚了,其实还是挺容易的吧!!