tongji 1016: predict

题目描述

随着小猪界象征着最高级别的小猪足球世界杯的开打,很多人都加入了猜球的行列,小香猪由于各种原因以球员的身份参赛,但是她也积极加入猜球行列。小猪足球世界杯是分成好几轮来打的,每一轮有特定场次比赛组成,每一场比赛以后,如果你不仅可以通过猜对这一场比赛的胜负而得分,而且如果猜对了比分,还可以得到额外的分数,每一轮结束以后,获得最高分的人会因此而得到特殊的分数,我们把它叫做一摩尔(等一下如果出现平局一摩尔就会派上用处啦)。如果此时有多人同时获得最高分,那么每人将得到一摩尔。
当小猪足球世界杯比赛结束以后,获得分数最高的将被封为球神的称号。
前些日子这一些事情听起来还很遥远,可是转眼明天将举行最后的决赛,但是博彩公司现在还没有开始算每个人的得分,那么请你赶快写一个程序来计算每个人的得分。
博彩公司会给你所有参加猜球者的姓名,他们对每一场球赛的预测,以及每一场球赛的结果和比分。你需要算出每一个参与者的得分和他的摩尔数,并按他们的得分排序输出。
在这个博彩公司,如果你猜对一场球的胜负平那么将得到一分,如果不仅如此,还猜中了比分,那么你将得到额外的两分。

输入

输入文件的第一行是一个正整数Case,表示一下有Case组测试数据。对于每一组测试数据的第一行,将有由空格隔开的两个正整数p(1 <= p <= 50), r(1 <= r <= 14)组成,p表示参加猜球的人数,r表示球赛一共进行r轮。接下来包含p行,其中第i行表示第i个参与者的名字,他们的名字由至多50个字符组成。接下来会有r个描述,分别给出每一轮的球赛信息。
对于每一轮,第一行由一个正整数g(1 <= g <= 16)组成,表示这一轮一共进行了g场比赛。接下来给出每一场比赛的信息。
对于每一场比赛,首先包含这场比赛的比分,接下来有p行,分别表示每一个猜球者对这场比赛比分作出的预测。所有比分都以X : Y的形式给出(分号前后以一个空格隔开),这里X,Y是非负整数。

输出

对于每一组输入数据,第一行输出 “Scenario #i:”,其中i表示当前是第i组数据,i从1开始计数。接下来的p行给出所有参与者的分数和摩尔数以及他们的名字,具体输出方式有以下要求:
1、 获得分数越多的排名越高;
2、 如果分数相同,他们的摩尔数越多排名越高;
3、 如果分数相同摩尔数也相同,那么按照输入顺序输出。
4、 对于每一行,分数、摩尔数、姓名必须以一个空格隔开。每一组输出数据以一个空行结束。
样例输入

2
2 2
Gerhard Delling
Guenter Netzer
1
4 : 3
0 : 1
1 : 0
2
1 : 0
1 : 0
1 : 0
0 : 0
2 : 1
0 : 0
3 1
Johannes B. Kerner
Urs Meier
Juergen Klopp
1
2 : 1
2 : 1
2 : 1
2 : 1

样例输出

Scenario #1:
7 2 Guenter Netzer
3 0 Gerhard Delling

Scenario #2:
3 1 Johannes B. Kerner
3 1 Urs Meier
3 1 Juergen Klopp

#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;
struct pe {
    string name;
    int mol;
    int score;
};
int p, r;
pe pes[50];
int score[50]; //每一轮的分数
void solve()
{
    int i, j, g, m;
    scanf("%d%d", &p, &r);
    fill(pes, pes + p, pe{ "", 0, 0 });
    cin.get();
    for (i = 0; i < p; i++) {
        getline(cin, pes[i].name);
    }
    for (i = 0; i < r; ++i) {//每一轮
        memset(score, 0, sizeof score);
        scanf("%d", &g);
        for (j = 0; j < g; ++j) {//每一场
            int a, b, qu;
            scanf("%d : %d", &a, &b);
            if (a > b) qu = 1;
            else if (a == b) qu = 0;
            else qu = -1;
            for (m = 0; m < p; m++) { //每一个人
                int c, d, qu1;
                scanf("%d : %d", &c, &d);
                if (c > d) qu1 = 1;
                else if (c == d) qu1 = 0;
                else qu1 = -1;
                if (qu == qu1) {
                    score[m]++;
                    if (a == c && b == d)
                        score[m] += 2;
                }
            }
        }
        int max = 0;
        for (j = 0; j < p; j++)
            if (score[j] > max)
                max = score[j];
        for (j = 0; j < p; j++) {
            pes[j].score += score[j];
            if (score[j] == max)
                pes[j].mol++;
        }
    }
    pe p1;
    for(i = 0; i < p; ++i)
        for (j = i + 1; j < p; ++j) 
            if (pes[i].score > pes[j].score || pes[i].score == pes[j].score && pes[i].mol > pes[j].mol) {
                p1 = pes[i];
                pes[j] = pes[i];
                pes[i] = p1;
            }
    for (i = 0; i < p; ++i) {
        printf("%d %d ", pes[i].score, pes[i].mol);
        cout << pes[i].name << endl;
    }
}
int main()
{
    int loop, i;
    scanf("%d", &loop);
    for (i = 0; i < loop; ++i) {
        printf("Scenario #%d:\n", i + 1);
        solve();
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值