[刷题]算法竞赛入门经典(第2版) 4-8/UVa12108 - Extraordinarily Tired Students
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO
代码:(Accepted,0 ms)
//UVa12108 - Extraordinarily Tired Students
#include<iostream>
struct how_cute_my_sleepy_boys_are {
int a,//awaken period : a>=1;
b,//sleeping period : b<=5;
s,//state : 0醒着,1睡觉;
t;//time : 睡/醒到什么时候;
}g[12];
int n, c, mi, cnt, T = 0;//cnt:统计睡着的人;mi:minute
int main()
{
//freopen("in.txt", "r", stdin);
while (scanf("%d", &n) && n != 0) {
for (int I = 0;I < n;++I) {//读入数据
scanf("%d%d%d", &g[I].a, &g[I].b, &c);
g[I].s = (c > g[I].a ? 1 : 0);
g[I].t = (g[I].s ? g[I].a + g[I].b - c + 1 : g[I].a - c + 1);
}
for (mi = 1;mi < 400;++mi) {//直接循环400分钟,不高兴做-1这一情况的循环检查了
cnt = 0;
for (int I = 0;I < n;++I)//计算本分钟的睡觉人数
if (g[I].s == 1) ++cnt;
if (!cnt) break;
for (int I = 0;I < n;++I) {//睡或醒状态转换
if (g[I].t != mi) continue;
if (g[I].s == 1) g[I].s = 0, g[I].t += g[I].a;
else if (cnt > n / 2) g[I].s = 1, g[I].t += g[I].b;
else g[I].t += g[I].a;
}
}
printf("Case %d: %d\n", ++T, !cnt ? mi : -1);
}
return 0;
}
题意:一个班级所有学生个个是特“困”生。每个人睡着和醒着有一定规律,那就是:醒着a分钟,然后想睡觉了,环顾四周,如果睡着的人比醒着的多,那我也睡,睡b分钟后再坚挺a分钟,否则直接再坚挺a分钟。简言之,也就是每醒a分钟就检查接下来是继续醒a分钟还是睡b分钟后再醒a分钟。(这“醒a分钟-睡b分钟”的a+b分钟被题目称为一个周期。)然后每个学生一上课就有个初始状态,是在各自醒-睡周期的第几分钟。求何时第一次全班醒着,还是说全班永远有人在睡觉。
分析:直接模拟每一分钟即可。struct一个结构体储存每个学生的状态,存放内容代码注释里已经很详细。本来t想存放的是还有几分钟到达目前状态的最后一分钟,但转念一想这样的话每分钟都要自减一次,直接存到哪一分钟更为便捷。具体模拟没用问题,很简单。
最大的问题是,就是老师上课永无天日的情况,永远没人醒着。本来我想做个数组存放每分钟的状态检查其是否构成循环,想想略麻烦,但是我看网上大家好多人都没检查,直接从一分钟检测到1000分钟(或其他很大的数字),1000分钟后还是没有全醒的情况就直接判定为“it’ll never happen”。的确不够严谨但是很方便。最后昨晚睡觉前想了下,决定使用这个不严谨的方案。理由如下:
- 本来这每一分钟的模拟运算量就很小,还要每一分钟都去循环判断,有循环且循环很短的情况下不错,但是如果循环有几百分钟或很久后找到全醒的情况,综合这些情况下好像并不很合算。
- 题目的状态转换并不复杂,1000分钟甚至更短(我用的400分钟就AC了)该循环的绝对能循环了,当然数学上肯定能求出个这个分钟的最小值,也没必要去搞吧。
- 谁上个课上1000分钟啊!!!我一开始循环的150分钟,也已经2.5个小时了,结果WA,改成400分钟,AC了。400分钟已经6.666小时了。嗯,可以,老师学生们都很666。。。
- 听谁说过:竞赛题没人看你的代码是否优美,它也不关心你的算法,只要通过就行。→.→适当投机有益身心健康哈(大雾)。
- 懒得写循环检查了哈哈>_<。
[刷题]算法竞赛入门经典(第2版) 4-8/UVa12108 - Extraordinarily Tired Students的更多相关文章
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
- [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci
题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...
- [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A
题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...
- [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...
- [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation
题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...
- [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile
题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...
- [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536
这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...
- [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities
题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...
- [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary
题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...
随机推荐
- B/S(Web)实时通讯解决方案
B/S的实时通讯实现起来比较麻烦,因为http协议是无状态的,导致一些实时消息通知和聊天等功能比较难以实现,本文主要简述几种自己之前常用的几种方式. 1.传统的HTTP协议是无状态的 传统的HTTP协 ...
- Linux开机启动(bootstrap)下
init process (根据boot loader的选项,Linux此时可以进入单用户模式(single user mode).在此模式下,初始脚本还没有开始执行,我们可以检测并修复计算机可能存在 ...
- Mybatis基础学习(一)—初识MyBatis
一.MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...
- Android中实现定时器的四种方式
第一种方式利用Timer和TimerTask 1.继承关系 java.util.Timer 基本方法 schedule 例如: timer.schedule(task, delay,period); ...
- jquery判断邮箱对错
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 图解CSS选择器之nth家族
1 nth-last-of-type 顾名思义从最后开始的元素开始选取可接受 数字 关键词 公式 比如4n+0就是每隔四个 odd even关键词表示奇偶数 .classify-item:nth- ...
- Ranklib源码剖析--LambdaMart
Ranklib是一套优秀的Learning to Rank领域的开源实现,其中有实现了MART,RankNet,RankBoost,LambdaMart,Random Forest等模型.其中由微软发 ...
- Spring MVC__自定义日期类型转换器
WEB层采用Spring MVC框架,将查询到的数据传递给APP端或客户端,这没啥,但是坑的是实体类中有日期类型的属性,但是你必须提前格式化好之后返回给它们.说真的,以前真没这样做过,之前都是一口气查 ...
- Java将一个目录下的所有数据复制到另一个目录下
/* 将"C:\\JavaProducts\\Source"下的所有数据复制到"C:\\Target"下 */ import java.io.*; public ...
- java设计模式--基础思想总结--父类引用操作对象
看设计模式的相关书籍也有一段时间了,一开始其实是抱着作为java三大框架的基础知识储备来学习的,不过到后来,才发现,在设计模式的一些准则装饰下,java的面向对象威力才真正地体现出来,后面的将会陆续地 ...