这道题让我回想起了自己那总是昏昏欲睡的学生时代,万分怀念!
要解决的问题就是如何判断不存在“全部都清醒”的时刻,我的做法是把每个人的初始状态记录下来。
如果随着时间推移再次出现了与初始状态相同的状态,就是出现了循环,说明“全部都清醒”的时刻不存在。
//#define LOCAL
//#define TESTING
#include<stdio.h>
#include<string.h>
int main()
{
int n,a[12],b[12],c[12],begin[12],kase = 0;
#ifdef LOCAL
freopen("xt4-8.in", "r", stdin);
freopen("xt4-8.out", "w", stdout);
#endif
for(;;)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(begin,0,sizeof(begin));
kase++;
scanf("%d", &n);
if(n==0) break;
for(int i = 1; i <= n; i++)
{
scanf("%d%d%d", &a[i],&b[i],&c[i]);
begin[i] = c[i];
}
#ifdef TESTING
printf("%d\n",n);
for(int i = 1; i <= n; i++)
{
printf("%d %d %d\n", a[i],b[i],c[i]);
}
#endif
bool slept[10];
int awake=0,sleep=0;
for(int i = 1; i <= n; i++)
{
if(c[i]<=a[i])
{
slept[i] = false;
awake++;
}
else
{
slept[i] = true;
sleep++;
}
}
#ifdef TESTING
printf("1 ");
for(int i = 1; i <= n; i++)
{
printf("%d:%d ",i, slept[i]);
}
printf("\n");
#endif
bool find = false;
if (sleep == 0)
{
printf("Case %d: 1\n",kase);
continue;
}
else for(int clock = 2; ; clock++)
{
int loopind = 0,fallin=0,wake=0;
for(int i = 1; i <= n; i++)
{
c[i]++;
if(c[i]==a[i]+1)
{
if(sleep>awake)
{
slept[i] = true;
fallin++;
}
else c[i]=1;
}
else if(c[i]>(a[i]+b[i]))
{
wake++;
slept[i]=false;
c[i] = 1;
}
if(c[i]==begin[i]) loopind++;
}
sleep = sleep+fallin-wake;
if(!sleep)
{
printf("Case %d: %d\n",kase,clock);
break;
}
if(loopind==n)
{
printf("Case %d: -1\n",kase);
break;
}
awake = n -sleep;
#ifdef TESTING
printf("%d ",clock);
for(int i = 1; i <= n; i++) printf("%d:%d ",i, slept[i]);
printf("\n");
#endif
}
}
}
博客回顾了UVa12108题目,探讨如何判断在学生状态变化中不存在所有学生都清醒的时刻。通过记录初始状态并检查循环来确定这一情况。
3792

被折叠的 条评论
为什么被折叠?



