冰壶比赛

题目描述
​ 在冰壶比赛中,给出一个目标点 P 以及一个规定的正整数 r,每一局由甲和乙两队轮流投冰壶各 8 次后,该局比赛结束。此时,那一方的冰壶最终离目标点最近,该方得分,另一方不得分。得分方每顶离目标点 P 距离小于或等于 r,位置较另一队所有冰壶都更接近目标点 P 的冰壶都可以得 1 分。

​ 比赛最多进行 10 局。双方之间的某局比赛结束后,落后一方可以弃权,此时比赛 不再进行下去。已知某一局结束时,双方的每个冰壶离目标点 P 的距离以及正整数 r,请写一个程序判断两队之间每一局比赛的得分,以及总得分。

输入
​ 第 1 行一个正整数 r。

​ 以下有若干行,表示对局,每一行 8 个正整数;

​ 第 2 行的第 j 个数表示第 1 局比赛结束时,甲方的第 j 个冰壶距离目标点 P 的距离;

​ 第 3 行的第 j 个数表示第 1 局比赛结束时,乙方的第 j 个冰壶距离目标点 P 的距离;

​ ……

​ 第 2k 行的第 j 个数表示第 k 局比赛结束时,甲方的第 j 个冰壶距离目标点 P 的距离;

​ 第 2k+1 行的第 j 个数表示第 k 局比赛结束时,乙方的第 j 个冰壶距离目标点 P 的距离;

​ 如果有一方中途弃权,则最后一行(偶数行)只有一个整数 −1,表示此时发生弃权情况;

​ 比赛最多进行 10 局,若输入多于 21 行,请忽略 21 行后的所有内容。

输出
​ 输出若干行,每行两个整数,中间以一个冒号分隔,表示每一局比赛甲乙双方的比分(甲得分在前)。

​ 最后一行有 2 个整数,中间以一个冒号分隔,表示甲乙双方比赛的最终得分(甲得分在前)。

样例输入

8
5 20 18 19 3 15 13 3
20 2 17 12 5 18 10 11
20 3 4 1 2 11 9 2
1 15 19 9 8 14 11 10
15 2 10 1 19 14 3 18
15 17 21 19 24 32 19 26
-1

样例输出

0:1
0:0
3:0
3:1

样例输入2

8
5 20 18 19 3 15 13 3
20 2 17 12 5 18 10 11
20 3 4 1 2 11 9 2
1 15 19 9 8 14 11 10
15 2 10 1 19 14 3 18
15 17 21 19 24 32 19 26
5 1 14 13 15 2 3 11
14 7 5 19 10 12 6 9
3 14 9 8 4 8 3 10
14 6 9 4 8 2 1 5
9 8 1 2 8 8 7 18
16 8 20 19 3 1 10 5
2 13 19 2 18 9 18 3
6 5 5 20 6 17 2 18
17 3 20 6 9 3 17 17
20 10 8 12 19 19 18 20
15 18 4 18 17 14 5 16
6 14 8 14 19 7 13 7
-1

样例输出2

0:1
0:0
3:0
3:0
0:2
0:0
0:0
3:0
2:0
0:0
11:3

样例说明
​ 在样例 1 和样例 2 中。

​ 第 1 局比赛时,四方离目标点 P 的最近距离为 3,乙方离目标点 P 的最近距离为 2,乙方得分。乙比甲方的 3 更小的值只有 1 个(2 壶),因此乙方得 1 分;

​ 第 2 局比赛时,甲方离目标点 P 的最近距离为 1,乙方离目标点 P 的最近距离为 1,双方均不得分。

​ 第 3 局比赛时,甲方离目标点 P 的最近距离为 1,乙方离目标点 P 的最近距离为 15,甲方得分。甲比乙方的 15 小的值有 5 个 (2,10,1,14,3)。但小于或等于 r=8 的值只有 3 个(2,1,3)。因此甲得 3 分。

​ 样例 1 只进行了 3 局,总得分是 3:1。样例 2 第 10 局比赛才有弃权,总得分为 11:3。

#include<iostream>
#include <algorithm>
using namespace std;

int m[15][2], r;
void print(int cnt) {
    int ans0 = 0, ans1 = 0;
    for (int i = 0; i < cnt; i++) {
        cout << m[i][0] << ":" << m[i][1] << endl;
        ans0 += m[i][0];
        ans1 += m[i][1];
    }
    cout << ans0 << ":" << ans1 << endl;
}

int main(){
    cin >> r;
    for (int i = 0; i < 10; i++) {
        int num0[10], num1[10];
        for (int j = 0; j < 8; j++) {
            cin >> num0[j];
            if (num0[j] == -1) {
                print(i);
                return 0;
            }
        }
        for (int j = 0; j < 8; j++) {
            cin >> num1[j];
        }
        sort(num0, num0 + 8);
        sort(num1,  num1 + 8);
        if (num0[0] < num1[0]) {
            for (int j = 0; j < 8 && num0[j] < num1[0] && num0[j] <= r; j++) {
                m[i][0]++;
            }
        } else {
            for (int j = 0; j < 8 && num1[j] < num0[0] && num1[j] <= r; j++) {
                m[i][1]++;
            }
        }
    }
    print(10);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yitahutu79

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值