這題要看圖,只要對於圖看懂了,就莫得問題了,
我採用的是判斷當前,每次循環 +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;
}