测试点数据太水了
  • 板块P2645 斯诺克
  • 楼主xq2023qx
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/17 10:24
  • 上次更新2024/1/17 11:00:39
查看原帖
测试点数据太水了
966305
xq2023qx楼主2024/1/17 10:24

写了半天,写出下面的程序,本以为还是不错的,自己写的各种情况的测试数据也能得出预想的正确答案。 结果测试就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;
}

搞不懂为什么。知道看了别人的题解,才恍然大悟! 题设都是废话,只要看最后一颗就行,管他什么球有没有被打完……

2024/1/17 10:24
加载中...