一个简单的题,虽然简单,但自己也一直卡在变量的赋值的问题上本来赋给结构体内部,却赋给了main函数里的变量。
一个小小小小的教训,下次注意,!
大体思路:
从题目阐述来看题目条件(1 ≤ a,b ≤ 5),而学生的数量也是很小(1 ≤ n ≤ 10),总之,数据量非常少,来判断是不是找到
都清醒的情况可以开大循环的终止条件,因为数据量很小,1000 + 5足够,做完之后,我搜索了一下学长写的,好像
500就差不多可以AC啦!所以不要怕会RE!!这个题非常适合建立一个学生类型的结构体数组(15个就非常保险了),
存取醒的时间,睡的时间,和周期时间(醒和睡 的总长度)和c(当前的时刻,可以判断下一刻是不是睡觉)。写main
函数依旧是先写整体框架,在写其他函数(自顶向下,逐步求精),就是用到一个获取醒的时间函数,函数里就是先判
断睡觉的个数,在根据c和a,b的关系 来 判断下一刻是否睡觉。最后返回醒的数量。给main函数里的for循环来判断是
不是停止循环:
#include<stdio.h>
#include<string.h>
#define N 1000 + 5
#define MAXN 10 + 5
struct student
{
int a,b,c,len;
int is_sleep;
}stu[MAXN];
int get_awake(int m)
{
int i,j,num = 0;
for (i = 1; i <= m; i++)
if (!stu[i].is_sleep)num++;
if (2 * num < m)//sleep!
{
for (i = 1; i <= m; i++)
{
stu[i].c = (stu[i].c + 1) % stu[i].len;
if (stu[i].c == 0)stu[i].c = stu[i].len;
if (stu[i].c > stu[i].a)stu[i].is_sleep = 1;
else stu[i].is_sleep = 0;
}
}else
{
for (i = 1; i <= m; i++)
{
stu[i].c = (stu[i].c + 1) % stu[i].len;
if (stu[i].c == 0)stu[i].c = stu[i].len;
if (stu[i].c > stu[i].a)stu[i].is_sleep = 1;
else stu[i].is_sleep = 0;
if (stu[i].c == stu[i].a + 1)
{
stu[i].is_sleep = 0;
stu[i].c = 1;
}
}
}
return num;
}
int main()
{
int m,cont = 0,awake;
while(scanf("%d",&m) == 1 && m)
{
int i,a,b,c;
for(i = 1; i <= m; i++)
{
scanf("%d%d%d",&stu[i].a,&stu[i].b,&stu[i].c);
stu[i].len = stu[i].a + stu[i].b;
if (stu[i].c > stu[i].a)stu[i].is_sleep = 1;
else stu[i].is_sleep = 0;
}
for (i = 1; i < N; i++)
{
awake = get_awake(m);
if (m - awake == 0){printf("Case %d: %d\n",++cont,i);break;}
}
if (i == N)printf("Case %d: -1\n",++cont);
}
return 0;
}