一:题目
课堂上有n个学生(n<=10),每个学生上课都会出现一个“清醒-睡眠”周期,其中第i个学生学习Ai分钟后睡眠Bi分钟,依次重复。其中在从清醒到睡眠时有一个条件:只有到全班睡眠人数大于清醒人数时,这个学生才敢睡觉。
题目使用(A,B,C)来描述一个学生的信息,A是该学生的清醒时间,B是该学生的睡眠时间,C是该学生的初始状态值(即在初始时是这个周期的第几分钟)
问经过多久,所有人都清醒,当然也可能不存在这个时间,就输出-1.
(一)案例详解
3 学生人数
2 4 1 清醒2分钟 睡眠4分钟 初始状态是在周期第1分钟
1 5 2 清醒1分钟 睡眠5分钟 初始状态是在周期第2分钟
1 4 3 清醒1分钟 睡眠4分钟 初始状态是在周期第3分钟
(一)样例输入
3 学生人数
2 4 1 清醒2分钟 睡眠4分钟 初始状态是在周期第1分钟
1 5 2 清醒1分钟 睡眠5分钟 初始状态是在周期第2分钟
1 4 3 清醒1分钟 睡眠4分钟 初始状态是在周期第3分钟
3
1 2 1
1 2 2
1 2 3
0
(二)样例输出
二:代码实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string>
#define CLASSTIME 1000000 //设置课程时间最大
int sNum; //学生人数1-10
int a[11], b[11], c[11]; //记录各个学生的初始信息
获取学生信息
int getStuInfo()
{
scanf("%d", &sNum);
if (!sNum)
return 0;
getchar();
for (int i = 1; i <= sNum; i++)
{
scanf("%d %d %d", &a[i], &b[i], &c[i]);
getchar();
}
return 1;
}
获取全部学生清醒的时刻(真正开始上课的时间)
int getRealStuTime()
{
int count;
for (int i = 1; i < CLASSTIME;i++)
{
count = 0;
for (int j = 1; j <= sNum; j++) //先获取睡觉人数
if (c[j] > a[j]) //在睡觉
count++;
if (count == 0) //全部在学习
return i;
for (int j = 1; j <= sNum; j++) //更新状态
{
if (c[j] == a[j] + b[j] || (c[j] == a[j] && count < sNum - count)) //一个周期 或者 如果睡觉人数少于学习人数,则不敢睡觉,开始重新学习
c[j] = 0;
c[j]++; //更新每个学生的状态
}
}
return -1;
}
主函数
void main()
{
int n = 1;
FILE* fp = freopen("data8.in", "r", stdin);
freopen("data8.out", "w", stdout);
while (getStuInfo())
printf("Case %d: %d
", n++, getRealStuTime());
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
}