UVa12108 - Extraordinarily Tired Students 题解

题目

题目链接

UVa12108 - Extraordinarily Tired Students

题目大意

课堂上有n个特别困的学生,每个学生都是清醒与睡觉循环。第i个学生清醒时长为ai,睡觉时长为bi。初始时,第i个学生处在ci的时刻。

当第i个学生想要入睡时候,他会观察所有人,如果睡觉的大于清醒的,那他就睡,否则他就再扛ai分钟。

写一个程序求所有学生第一次全部清醒的时间。

输入

输入包含多个测试情况。
每个测试情况的第一行为学生数n(1<=n<=10),接下来n行描述每个学生的a,b,c(1<=a,b<=5)。

输出

对于每个情况,输出情况序号,和全部学生第一次全体清醒的时间。如果不存在全部清醒的情况,则输出-1。

样例输入

3
2 4 1
1 5 2
1 4 3
3
1 2 1
1 2 2
1 2 3
0

样例输出

Case 1: 18
Case 2: -1

题解

这道题直接模拟就行了。

关键是如何判断不存在清醒的情况?
当时间过了很久后,还没有学生清醒,就可以认为不存在这种情况。

Then show the code.

#include <stdio.h>

const int BIG = 1e5;
int a[15], b[15], c[15];
int n, kase;

int main(){
    while(scanf("%d", &n) == 1 && n){
        for(int i=1; i<=n; i++)
            scanf("%d%d%d", &a[i], &b[i], &c[i]);
        //统计清醒人数
        for(int i=1; i<=BIG; i++){
            int wake = 0;
            for(int j=1; j<=n; j++)
                if(c[j] <= a[j]) wake++;

            if(wake == n){
                printf("Case %d: %d\n", ++kase, i);
                break;
            }else if(i == BIG){
                printf("Case %d: %d\n", ++kase, -1);
                break;
            }

            for(int j=1; j<=n; j++){
                //当睡完觉 or 想睡觉时候发现睡觉的人太少
                if(c[j]==a[j]+b[j] || (c[j] == a[j] && (wake >= n-wake))) 
                    c[j] = 0;
                c[j]++;
            }   
        }
    }
    return 0;
}
posted @ 2020-11-21 17:54  1v7w  阅读(123)  评论(0编辑  收藏  举报