挺水的一道,不过把睡觉人数严格大于清醒人数看反了。属于一个“=”的错误,这个错误的发生不能容忍。
#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;
}
浙公网安备 33010602011771号