题意:n个人两两玩剪刀石头布的游戏,每个人玩k次,求最后每个人的胜利次数/(胜利次数+失败次数)

题解:细心一点就没什么问题了。

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int win[105],lose[105];
 6 int comp(char s1[],char s2[])
 7 {
 8     switch(s1[0])
 9     {
10     case 'r':
11         switch(s2[0])
12         {
13         case 'r':
14             return 0;
15         case 'p':
16             return -1;
17         case 's':
18             return 1;
19         }
20         break;
21     case 'p':
22         switch(s2[0])
23         {
24         case 'r':
25             return 1;
26         case 'p':
27             return 0;
28         case 's':
29             return -1;
30         }
31         break;
32     case 's':
33         switch(s2[0])
34         {
35         case 'r':
36             return -1;
37         case 'p':
38             return 1;
39         case 's':
40             return 0;
41         }
42     }
43 }
44 int main()
45 {
46     int n,k;
47     bool first=true;
48     while(scanf("%d%d",&n,&k)!=EOF,n)
49     {
50         memset(win,0,sizeof(win));
51         memset(lose,0,sizeof(lose));
52         if(first)
53             first=false;
54         else
55             printf("\n");
56         int all=k*n*(n-1)/2;
57         for(int i=0; i<all; i++)
58         {
59             int a,b,c;
60             char s1[10],s2[10];
61             scanf("%d%s%d%s",&a,s1,&b,s2);
62             c=comp(s1,s2);
63             if(c==1)
64                 win[a]++,lose[b]++;
65             else if(c==-1)
66                 win[b]++,lose[a]++;
67         }
68         for(int i=1;i<=n;i++)
69         {
70             if(win[i]+lose[i]==0)
71                 printf("-\n");
72             else
73                 printf("%.3lf\n",(double)(win[i])/(double)(win[i]+lose[i]));
74         }
75     }
76     return 0;
77 }