输入学生个数、醒A分钟、睡B分钟和现在状态,输出第几分钟全部醒
做题体会:
题目不难,不过需要集中精神思考,处理好数组里的数,不要出现逻辑错误;当现在状态等于初始状态时,表示进入死循环,不存在全部醒的时候
begin数组里,第1列表示状态A,第2列表示状态B,第3列表示初始状态,第4列表示现在状态,数组sleep为1时表示睡,为0时表示醒;yn=1时可以进入睡眠状态;
#include <stdio.h>
int n, begin[12][5], sleep[12];
int yn; // if睡>醒 进入 睡,else 继续醒
void check(int numstu)
{
if(begin[numstu][3] > (begin[numstu][0]+begin[numstu][1]))
begin[numstu][3] = begin[numstu][3] - (begin[numstu][0] + begin[numstu][1]);
if(begin[numstu][3] == begin[numstu][0]+1 && yn) // yn=1 时可以睡
sleep[numstu] = 1;
else if(begin[numstu][3] == begin[numstu][0]+1 && yn == 0)
{
sleep[numstu] = 0;
begin[numstu][3] = 1;
}
else if(begin[numstu][3] < begin[numstu][0]+1)
sleep[numstu] = 0;
else if(begin[numstu][3] > begin[numstu][0]+1)
sleep[numstu] = 1;
} //是否睡,赋值给sleep数组
void yesno()
{
int i, sleepnum = 0;
for(i = 1; i <= n; i++)
if(sleep[i] == 1)
sleepnum++;
if(sleepnum > n-sleepnum)
yn = 1;
else yn = 0;
} //根据sleep数组判断是否可以睡觉
int main()
{
while(scanf("%d", &n) && n)
{
int i, ffvs = 1, nCase = 1, xing = 1;
for(i = 1; i <= n; i++)
{
scanf("%d%d%d", &begin[i][0], &begin[i][1], &begin[i][2]);
}
for(i = 1; i <= n; i++)
{
for(;;)
{
if(begin[i][2] > (begin[i][0]+begin[i][1]))
begin[i][2] -= (begin[i][0]+begin[i][1]);
else break;
}
if(begin[i][2] > begin[i][0])
sleep[i] = 1;
else sleep[i] = 0;
}
yesno();
for(i = 1; i <= n; i++)
{
begin[i][3] = begin[i][2];
}
for(i = 1; i <= n; i++)
{
if(sleep[i] == 1)
xing = 0;
} //是否全部醒
if(xing)
{
printf("Case %d: %d\n", nCase++, ffvs);
ffvs = 0;
}
for(;ffvs >= 1;)
{
int dgyu = 1, xing = 1;
ffvs++;
for(i = 1; i <= n; i++)
{
begin[i][3]++;
check(i);
} //更新完sleep数组
for(i = 1; i <= n; i++)
{
if(begin[i][2] != begin[i][3])
dgyu = 0;
}
if(dgyu)
{
printf("Case %d: -1\n", nCase++); // 不存在全部清醒
break;
}
for(i = 1; i <= n; i++)
{
if(sleep[i] == 1)
xing = 0;
} //是否全部醒
if(xing)
{
printf("Case %d: %d\n", nCase++, ffvs);
break;
}
yesno();
}
}
return 0;
}