Extraordinarily Tired Students
Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown
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.更新所有学生下个时刻的状态。
算法:
详见代码注释。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。