POJ2654 HDU1148 ZOJ2552 UVA10903 Rock-Paper-Scissors Tournament【水题】

Rock-Paper-Scissors Tournament

Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 3237   Accepted: 1087

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*n*(n-1)/2 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

Hint

Huge input,scanf is recommended.

Source

Waterloo local 2005.09.17

问题链接POJ2654 HDU1148 ZOJ2552 UVA10903 Rock-Paper-Scissors Tournament

问题描述:(略)

问题分析

  这个题是有关石头剪刀布的游戏,按照题意计算即可。归类为模拟有点牵强附会附会。

程序说明

  程序中如果缺少28-29行,似乎在ZOJ2552中会TLE。

参考链接:(略)

题记:(略)

AC的C++语言程序如下:

/* POJ2654 HDU1148 ZOJ2552 UVA10903 Rock-Paper-Scissors Tournament */

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

using namespace std;

const int N = 100;
int w[N], l[N];

int main()
{
    int n, k, flag = 0;
    while(scanf("%d", &n) == 1 && n) {
        memset(w, 0, sizeof(w));
        memset(l, 0, sizeof(l));

        if(flag)
            printf("\n");
        flag = 1;

        scanf("%d", &k);
        for(int i = 0; i < k * n * (n - 1) / 2; i++) {
            int p1, p2;
            char m1[15], m2[15];
            scanf("%d%s%d%s", &p1, m1, &p2, m2);
            if(m1[0] == m2[0])
                continue;
            if((m1[0] == 'r' && m2[0] == 's') || (m1[0] == 's' && m2[0] == 'p') || (m1[0] == 'p' && m2[0] == 'r'))
                w[p1]++, l[p2]++;
            else if((m2[0] == 'r' && m1[0] == 's') || (m2[0] == 's' && m1[0] == 'p') || (m2[0] == 'p' && m1[0] == 'r'))
                w[p2]++, l[p1]++;
        }

        for(int i = 1; i <= n; i++)
            if(w[i] + l[i])
                printf("%.3f\n", (double)w[i] / (l[i] + w[i]));
            else
                printf("-\n");
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/tigerisland45/article/details/81501703
今日推荐