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

来源:互联网 发布:扫描文件编辑软件 编辑:程序博客网 时间:2024/04/29 18:34

现在一共有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
335 5 232 0 030 2 5
Sample Output
3No winnerNo 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;}


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

1 0
原创粉丝点击