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;
}
不忘初心方得始终