一、题目
课堂上有n个学生(n<=10)。每个学生都有一个“睡眠-清醒”周期,其中第i个学生醒Ai分钟后睡Bi分钟,然后重复(1<=Ai,Bi<=5),初始第i个同学处于他的周期的Ci分钟。每个学生在临睡前,只有全班睡觉人数严格大于清醒人数才睡觉,否则坚持Ai分钟后再检查。问经过多长时间全班都清醒,不存在输出-1.
二、解题思路
重点在于体会Ci的含义,Ci表示第i个同学在自身周期内所处的状态。模拟整个过程,注意时间取长点,但不要太长。
三、代码
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 #define INF 10000 6 const int maxn = 10 + 5; 7 int A[maxn], B[maxn], C[maxn]; 8 9 int main() 10 { 11 int n,T = 0; 12 while (scanf("%d", &n) == 1 && n) 13 { 14 for (int i = 0; i < n; i++) 15 scanf("%d%d%d", &A[i], &B[i], &C[i]); 16 int t; 17 for (t = 1; t < INF; t++) //从1开始的 18 { 19 int cnt = 0; //cnt代表当前清醒的人数 20 for (int i = 0; i < n; i++) 21 if (C[i] <= A[i]) 22 cnt++; 23 if (cnt == n) break; 24 25 for (int i = 0; i < n; i++) 26 { 27 //C[i]表示处于周期的C[i]分钟,注意所处状态的变化 28 if (C[i] == A[i] + B[i] || (C[i] == A[i] && cnt >= n - cnt)) 29 C[i] = 0; 30 C[i]++; 31 } 32 } 33 if (t == INF) t = -1; 34 printf("Case %d: %d ", ++T, t); 35 } 36 return 0; 37 }