HDU 1148 Rock-Paper-Scissors Tournament

本文介绍了一种算法,用于统计多人参与的石头剪刀布比赛中每位玩家的胜率。通过解析比赛记录,该算法能够准确计算每位玩家的胜利次数与失败次数,并据此计算平均胜率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Rock-Paper-Scissors Tournament

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 962    Accepted Submission(s): 305


Problem Description
Rock-Paper-Scissors is game for two players, A and B, who each choose, independently of the other, one of rock, paper, or scissors. A player chosing paper wins over a player chosing rock; a player chosing scissors wins over a player chosing paper; a player chosing rock wins over a player chosing scissors. A player chosing the same thing as the other player neither wins nor loses. 
A tournament has been organized in which each of n players plays k rock-scissors-paper games with each of the other players - k games in total. Your job is to compute the win average for each player, defined as w / (w + l) where w is the number of games won, and l is the number of games lost, by the player. 
 

Input
Input consists of several test cases. The first line of input for each case contains 1 ≤ n ≤ 100 1 ≤ k ≤ 100 as defined above. For each game, a line follows containing p1, m1, p2, m2. 1 ≤ p1 ≤ n and 1 ≤ p2 ≤ n are distinct integers identifying two players; m1 and m2 are their respective moves ("rock", "scissors", or "paper"). A line containing 0 follows the last test case. 
 

Output
Output one line each for player 1, player 2, and so on, through player n, giving the player's win average rounded to three decimal places. If the win average is undefined, output "-". Output an empty line between cases. 
 

Sample Input
  
  
2 4 1 rock 2 paper 1 scissors 2 paper 1 rock 2 rock 2 rock 1 scissors 2 1 1 rock 2 paper 0
 

Sample Output
  
  
0.333 0.667 0.000 1.000
 

Source
 

Recommend
Eddy
 

分析:根据题意来做就好了,题意就是n个人进行k场石头剪刀布的比赛,然后分别统计每个人的胜率。

代码:

#include<stdio.h>
#include<string.h>

int main()
{
    int n,k;
    int w[110],l[110];
    int T=1;
    while(scanf("%d",&n),n)
    {
        scanf("%d",&k);
        if(T==0)
            printf("\n");
        T=0;
        memset(w,0,sizeof(w));
        memset(l,0,sizeof(l));
        int a,b,i,m;
        char str1[10],str2[10];

        for(i=0;i<k;i++){
        scanf("%d",&a);
        scanf("%s",str1);
        scanf("%d",&b);
        scanf("%s",str2);
        if(strcmp(str1,"rock")==0)
        {
            if(strcmp(str2,"scissors")==0)
            {
                w[a]++;
                l[b]++;
            }
            if(strcmp(str2,"paper")==0)
            {
                l[a]++;
                w[b]++;
            }
        }
        if(strcmp(str1,"scissors")==0)
        {
            if(strcmp(str2,"paper")==0)
            {
                w[a]++;
                l[b]++;
            }
            if(strcmp(str2,"rock")==0)
            {
                l[a]++;
                w[b]++;
            }
        }
        if(strcmp(str1,"paper")==0)
        {
            if(strcmp(str2,"rock")==0)
            {
                w[a]++;
                l[b]++;
            }
            if(strcmp(str2,"scissors")==0)
            {
                l[a]++;
                w[b]++;
            }
        }
        }
        for(i=1;i<=n;i++)
        {
            m=w[i]+l[i];
            if(m==0)
                printf("-\n");
            else
                printf("%.3f\n",w[i]*1.0/m);
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值