冰壶比赛
在冰壶比赛中给出一个目标点 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
| 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 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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() { 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) { count = i; flag = 0; } } } 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; }
|
参考代码
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); 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; }
|