课堂上有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
Case 1: 18 Case 2: -1
#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", n++, getRealStuTime()); freopen("CON", "r", stdin); freopen("CON", "w", stdout); }