这题要看图,只要对于图看懂了,就莫得问题了,
我采用的是判断当前,每次循环 +1,如果超出周期,则说明人醒了要等于 1
然后判断当前睡着还是醒着就行了
接下来是对于临界于即将睡觉的人群的判断,如果他只能坚持,那莫得办法,让他 周期为0,等下一次加一则刚好为 1 完美!
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,a[23],b[23],zhou[23];
for (int t = 1; scanf("%d",&n)==1 && n; t++)
{
int fen = 1,ok = 0; //分就是当前时间
for (int i = 0; i < n; i++)
scanf("%d%d%d",&a[i],&b[i],&zhou[i]);
int shui = 0,xin = 0; //睡的和醒的
for (int i = 0; i < n; i++) //刚开始要先判断
{
if(zhou[i] > a[i]) shui++;
else xin++;
}
if(xin == n) ok = 1;
if(!ok)
{
for (int i = 2; i < 10000;i++) //如果都10000次还没找到那就是莫得了
{
xin = 0; shui = 0;
for (int j = 0;j < n; j++)//看的是当前
{
zhou[j]++;
if(zhou[j] > a[j]+b[j]) zhou[j] = 1;//如果此时大于则是醒了
if(zhou[j] <= a[j]) xin++;
else shui++;
}
if(xin == n)
{
ok = 1;
fen = i; break;
}
for (int j = 0; j < n; j++)//判断其能否意志坚定
{
if(zhou[j]==a[j] && xin >= shui) zhou[j] = 0;
}
}
}
printf("Case %d: ",t);
printf("%d\n",(ok)? fen: -1);
}
return 0;
}