写了半天,写出下面的程序,本以为还是不错的,自己写的各种情况的测试数据也能得出预想的正确答案。 结果测试就40分!
#include <iostream>
#include <algorithm>
using namespace std;
enum {
NONE = 0,
RED,
YELLOW,
GREEN,
BROWN,
BLUE,
PICK,
BLACK,
SUM
};
int main() {
// 两人击球次数
int time[2] = {0, 0};
// 两人分数和
int sum[2] = {0, 0};
// 剩余的球总数
int ball[8] = {-1, 15, 1, 1, 1, 1, 1, 1};
cin >> time[0] >> time[1];
for (int i = 0; i < 2; i++) {
// 最后一颗红球后可否打彩球
bool flg = false;
for (int j = 1; j <= time[i]; j++) {
int shoot = 0;
cin >> shoot;
if (ball[RED] != 0 || flg) { // 尚有红球
if (j % 2 == 1) { // 第奇数次击球
switch (shoot) {
case RED: // 击中红球
sum[i] += RED; // +1分
ball[RED]--;
if (ball[RED] == 0) flg = true; // 如果红球刚好打光,则还可以打一颗彩球
break;
case NONE: // 没击中球
case YELLOW:
case GREEN:
sum[(i+1)%2] += 4; // 对手+4分
break;
default:
sum[(i+1)%2] += shoot; // 对手+彩球分
}
} else { // 第偶数次击球
switch (shoot) {
case NONE: // 没击中球
case RED: // 击中红球
sum[(i+1)%2] += 4; // 对手+4分
break;
default:
sum[i] += shoot; // +彩球分
}
flg = false;
}
} else { // 没有红球
if (shoot == NONE) { // 没击中球
sum[(i+1)%2] += 4; // 对手+4分
} else if (ball[shoot-1] == 0) { // 比该球分值低的球已打光(加分)
sum[i] += shoot;
ball[shoot]--;
} else { // 比该球分值低的球未打光(罚分)
sum[(i+1)%2] += max(4, shoot); // 对手加分
}
}
}
}
cout << sum[0] << " " << sum[1];
return 0;
}
搞不懂为什么。知道看了别人的题解,才恍然大悟! 题设都是废话,只要看最后一颗就行,管他什么球有没有被打完……