特别困的学生 UVa12108(模拟题)

一、题目

课堂上有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 }
原文地址:https://www.cnblogs.com/lfri/p/9357495.html