冰壶比赛


在冰壶比赛中给出一个目标点 P 以及一个规定的正整数 r,每一局由甲和乙两队轮流投冰壶各 88 次后该局比赛结束。

此时哪一方的冰壶最终离目标点最近,该方得分另一方不得分。

得分方离目标点 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 个整数,中间以冒号分隔,表示甲乙双方比赛的最终得分(甲得分在前)。

样例

1
2
3
4
5
6
7
8
9
//样例1
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
1
2
3
4
0:1
0:0
3:0
3:1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
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
1
2
3
4
5
6
7
8
9
10
0:1
0:0
3:0
3:0
0:2
0:0
0:0
3:0
2:0
11:3

在样例 1 和样例 2 中。

  • 第1局比赛时,甲方离点P的最近距离为3,乙方离点P的最近距离为2,乙方得分。乙比甲方的3更小的值只有1个,因此乙方得 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。

试解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<iostream>
using namespace std;

int disTance[50][8];

int minDistance(int i) {
int ret = disTance[i][0];
for (int j = 1; j < 8; ++j)
if (disTance[i][j] < ret) ret = disTance[i][j];
return ret;
}

int countScore(int mindis, int i, int r) {
int score = 0;
for (int j = 0; j < 8; ++j)
if (disTance[i][j] < mindis && disTance[i][j] <= r) score++;
return score;
}

int main() {
//1.数据存储
int r;
int count;
int flag = 1;
cin >> r;
for (int i = 0; flag; ++i) {
for (int j = 0; j < 8 && flag; ++j) {
cin >> disTance[i][j];
if (disTance[i][j] == -1 || i > 19) {//双方中有一方弃权 或者 达到比赛的局数限制(20局)结束游戏
count = i;
flag = 0;
}
}
}
//2.数据处理
int scoreA = 0;
int scoreB = 0;
for (int i = 0; i < count - 1; i = i + 2) {
int minA = minDistance(i);
int minB = minDistance(i + 1);
if (minA > minB) {//乙方得分 输出具体得分
int temp = countScore(minA, i + 1, r);
printf("0:%d\n", temp);
scoreB += temp;
} else if (minB > minA) {//甲方得分 输出具体得分
int temp = countScore(minB, i, r);
printf("%d:0\n", temp);
scoreA += temp;
} else {
printf("0:0\n");
}
}
printf("%d:%d\n", scoreA, scoreB);
return 0;
}

image-20230225211652317

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<iostream>
#include<algorithm>
using namespace std;

int r;
int score[15][2];

void print(int cnt) {
int ans1 = 0, ans2 = 0;
for (int i = 1; i < cnt; ++i) {
cout << score[i][0] << ":" << score[i][1] << endl;
ans1 += score[i][0];
ans2 += score[i][1];
}
cout << ans1 << ":" << ans2 << endl;
}

int main() {
cin >> r;
for (int i = 1; i <= 10; ++i) {
int num1[10], num2[10];
for (int j = 0; j < 8; ++j) {
cin >> num1[j];
if (num1[j] == -1) {//双方中有一方弃权
print(i);
return 0;
}
}
for (int j = 0; j < 8; ++j) {
cin >> num2[j];
}
sort(num1, num1 + 8);
sort(num2, num2 + 8);
//直接存入的是score而不是distance
if (num1[0] < num2[0]) {
for (int j = 0; j < 8 && num1[j] < num2[0] && num1[j] <= r; ++j) score[i][0]++;
} else {
for (int j = 0; j < 8 && num2[j] < num1[0] && num2[j] <= r; ++j) score[i][1]++;
}
}
print(11);
return 0;
}