挺水的一道,不过把睡觉人数严格大于清醒人数看反了。属于一个“=”的错误,这个错误的发生不能容忍。



#include<iostream>
#define MINUTE 10e3
#define CYCLE (j + c[i] - 1) % (a[i] + b[i])           //循环到哪一步了
#define CYCLE_STATE (a[i] + b[i] - CYCLE + 1)          //未清醒的学生距离清醒时刻的长度
using namespace std;

int a[15], b[15], c[15];

int main() {
    int i, j, n, times = 0;

    while (cin >> n&& n) {
        int awaken_time = 0, len_max = 0;

        for (i = 0; i < n; i++)
            cin >> a[i] >> b[i] >> c[i];

        for (j = 1; j <= MINUTE; j++) {               //每一分钟检查下清醒学生和未清醒的学生
            int awaken = 0, sleeping = 0;
            for (i = 0; i < n; i++)
                if (CYCLE <= a[i]&& CYCLE != 0)      //当CYCLE == 0时,也就是在循环的最后一个数,需要特判下
                    ++awaken;
                else
                    ++sleeping;
            if (awaken >= sleeping) {                //睡觉人数严格小于清醒人数!!!这是错误的地方。
                awaken_time = j;
                break;
            }
        }

        if (awaken_time) {                          //如果有睡觉人数严格小于清醒人数的时候
            for (int i = 0; i < n; i++) {
                if (CYCLE > a[i]) {                 //这一时刻处于睡觉的人在哪个周期
                    if (len_max < CYCLE_STATE)      //如果这个人距清醒时间最远,则len_max等于这时间。
                        len_max = CYCLE_STATE;
                }
                else if (CYCLE == 0)                //上面说的特判,处于最后一个周期,则 +1
                    if (len_max < 1)
                        len_max = 1;
            }
            cout << "Case " << ++times
                << ": " << awaken_time + len_max << endl;
        } else                                      //如果awaken_time为 0, 则不存在全部清醒的时刻
            cout << "Case " << ++times
                << ": " << "-1" << endl;
    }
    return 0;
}