CSU 1202 石头剪刀布 只要有思路就没有什么难的

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_34678439/article/details/53560213

现在一共有N个人(分别记为1, 2, …, N)在玩剪刀石头布,如果知道他们每个人都出了什么,你能找出来谁是winner吗?

当且仅当一个人可以赢其他所有人时,才称这个人是winner。

我们将剪刀记作2,石头记作0,布记作5,那么胜负关系就应当是2能赢5,5能赢0,0能赢2。


Input

输入数据的第一行包含一个整数T ( 1 <= T <= 150),表示接下来一共有T组测试数据。

每组测试数据的第一行包含一个整数N (2 <= N <= 100000)表示一共有N个人在玩剪刀石头布,接下来一行一共有N个数,每个数均为0、2或5中的某一个,依次描述了这N个人分别出了什么,其中第i个整数描述了第i个人出了什么。

Output

对于每组数据,用一行输出一个整数表示winner是第几个人([1, N]中的某个整数)。

如果不存在winner,则用一行输出“No winner”(不包括引号)。

Sample Input
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;
}


这下看懂了吧,只要分析清楚了,其实还是挺容易的吧!!

猜你喜欢

转载自blog.csdn.net/baidu_34678439/article/details/53560213