Extraordinarily Tired Students

Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown

UVa 12108
UVa 12108


https://uva.onlinejudge.org/i...

Accepted Code

// Author : Weihao Long
// Created : 2018/01/04

#include "stdio.h"

#define MAX 100000

int main() {
    int t = 0;
    int n;
    while (scanf("%d", &n) != EOF) {
        if (!n)
            break;
        int a[15];     // 某学生周期内听课的时间
        int b[15];     // 某学生周期内睡觉的时间
        int c[15];     // 某学生目前处于周期内的何处
        for (int i = 0; i < n; i++)
            scanf("%d%d%d", &a[i], &b[i], &c[i]);
        int ans;     // 时刻
        int count;     // 某时刻清醒的人数
        for (ans = 1; ans < MAX; ans++) {     // 扫描时间轴
            count = 0;
            // 检查学生状态
            for (int i = 0; i < n; i++) {     // 扫描每个学生
                if (c[i] <= a[i])     // 若该同学正处于听课状态
                    count++;
            }
            // 若所有学生都清醒 终止循环
            if (count == n)
                break;
            // 更新学生状态
            for (int i = 0; i < n; i++) {     // 扫描每个学生
                if (c[i] == a[i] + b[i] || (c[i] == a[i] && count >= n - count)) {
                    // 若该学生的状态到达周期末尾
                    // 或正想睡觉时发现全班睡觉人数不足半
                    // 则将他的状态矫正到周期开始处
                    c[i] = 0;
                }
                c[i]++;     // 状态推移
            }
        }
        if (ans == MAX)
            ans = -1;
        printf("Case %d: %d\n", ++t, ans);
    }
    return 0;
}

Notes

题意:
课堂上有 n 个学生(n<=10)。每个学生都有一个“清醒-睡眠”周期。其中第 i 个学生醒 ai 分钟后睡 bi 分钟,然后重复(1<=ai,bi<=5),初始时第 i 个学生处在他的周期的第 ci 分钟。每个学生在临睡前会察看全班睡觉人数是否严格大于清醒人数,只有这个条件满足时才睡觉,否则就坚持听课 ai 分钟后再次检查这个条件。问经过多长时间后全班都清醒。

思路:
1.检查所有学生当前时刻的状态。
2.更新所有学生下个时刻的状态。

算法:
详见代码注释。


龙威昊
4 声望5 粉丝