思路:

①用结构体stu,属性有清醒时间,睡眠时间,开始处于的时间,状态(醒着还是睡着),

还有计数器。

②二维数组存表格。

在确定接下来要进入的状态之后,就一次把表格里持续状态的数据都修改掉,比如:

第一个学生的数据是2 3 1,那么开始的时候他要进入2t的清醒期,此时就把data[0][0]和data[0][1]修改为0(代表清醒),

再比如如果确定了接下来进入睡眠,长度为5,就把未来5个数据都修改掉。

判断第i个时间段是否能进入睡眠要查第i-1的时间段的睡眠和清醒的人数。⑤设定2000的次数,如果2000都没有找到答案则说明无解(不能设太小,我一开始设200就WA了o(╥﹏╥)o)。

总结:不要偷懒复制黏贴相似的代码,还是自己敲比较好,不然容易出奇怪的问题;

像我这样写得很复杂的最好还是认真梳理一下结构,不然太混乱了,写着写着就忘了(O_o)??。

要认真观察给出的数值范围。

 #include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w",stdout)
struct stu {
int wake;//清醒时间
int sleep;//睡眠时间
int time;//开始处于的时间
int sta;//状态,1:睡眠;0:清醒
int cnt;//计数器,看看处于某状态的第几个时间段
}stu[];
char data[][];//表格
int main()
{
//FIN;
//FOUT;
int n, kase = ;
while (scanf("%d", &n) == && n != )
{
kase++;
for (int n2 = ; n2<n; n2++)
{
scanf("%d%d%d", &stu[n2].wake, &stu[n2].sleep, &stu[n2].time);
}
memset(data, -, sizeof(data));//初始化
int ans = -;
for (int i = ; i<; i++)//最多数2000次,如果还找不到就算为无解 ,也是表格的行
{
int wake = ;
int sleep = ;
for (int j = ; j<n; j++)//遍历表格的列
{
if (i == )//i=0无需检查清醒人数和睡眠人数
{
if (stu[j].time > stu[j].wake)
{
if (stu[j].time >= (stu[j].wake + stu[j].sleep))//处于的时间比清醒和睡眠之和都大,要计算一下
{
stu[j].time %= (stu[j].wake + stu[j].sleep);//先取余
}
if (stu[j].time == )//说明是睡眠的最后一个时间段
{
stu[j].cnt = stu[j].sleep;
stu[j].sta = ;//睡觉
for (int l = stu[j].cnt, k = i; l <= stu[j].sleep; l++, k++)//一次性修改
{
data[j][k] = ;
// printf("j=%d k=%d data[%d][%d]=%d\n", j, k, j,k,data[j][k]);
}
}
else
{
if (stu[j].time >stu[j].wake)//取余了还是比wake大,就减去wake
{
stu[j].time -= stu[j].wake;
stu[j].cnt = stu[j].time;
stu[j].sta = ;//睡觉
for (int l = stu[j].cnt, k = i; l <= stu[j].sleep; l++, k++)
{
data[j][k] = ;
// printf("i=0 j=%d k=%d data[%d][%d]=%d\n", j, k, j, k, data[j][k]);
}
}
}
}
else
{
stu[j].cnt = stu[j].time;
stu[j].sta = ;//醒
for (int l = stu[j].cnt, k = i; l <= stu[j].wake; l++, k++)
{
data[j][k] = ;
// printf("i=0 j=%d k=%d data[%d][%d]=%d\n", j, k, j, k, data[j][k]);
}
}
// printf("stu[%d].cnt=%d stu[%d].sta=%d\n", j, stu[j].cnt, j, stu[j].sta);
}
else//i>0
{
if (stu[j].sta == )//睡觉
{
if (stu[j].cnt == stu[j].sleep)
{
stu[j].cnt = ;
stu[j].sta = ;//清醒
for (int l = stu[j].cnt, k = i; l <= stu[j].wake; l++, k++)
{
data[j][k] = ;//清醒
// printf("i>0 j=%d k=%d data[%d][%d]=%d\n", j, k, j, k, data[j][k]);
}
}
else
{
stu[j].cnt++;
}
}
else//清醒
{
int wake = , sleep = ;
for (int k = ; k < n; k++)
{
if (data[k][i-] == )
sleep++;
if (data[k][i-] == )
wake++;
}
// printf("i=%d wake=%d sleep=%d\n", i - 1, wake, sleep);
if (sleep > wake&&stu[j].cnt == stu[j].wake)//可以睡
{
stu[j].sta = ;
stu[j].cnt = ;
for (int l = stu[j].cnt, k = i; l <= stu[j].sleep; l++, k++)
{
data[j][k] = ;
// printf("可以睡 j=%d k=%d data[%d][%d]=%d\n", j, k, j, k, data[j][k]);
}
}
else if(stu[j].cnt==stu[j].wake)//不可以
{
stu[j].cnt = ;
stu[j].sta = ;
for (int l = stu[j].cnt, k = i; l <= stu[j].wake; l++, k++)
{
data[j][k] = ;
// printf("不可以睡 j=%d k=%d data[%d][%d]=%d\n", j, k, j, k, data[j][k]);
}
}
else
{
stu[j].cnt++;
}
}
}
wake = ;
for (int k = ; k<n; k++)
{
if (data[k][i] == )
wake++;
}
if (wake == n)
{
// printf("wake=n i=%d\n", i + 1);
ans = i+;
break;
}
}
if (ans != -)
{
break;
}
}
printf("Case %d: %d\n",kase,ans); }
return ;
}

UVA 12108 Extraordinarily Tired Students的更多相关文章

  1. 【模拟】UVa 12108 - Extraordinarily Tired Students

    When a student is too tired, he can't help sleeping in class, even if his favorite teacher is right ...

  2. uva 12108 Extraordinarily Tired Students (UVA - 12108)

    算法完全转载...原博客(https://blog.csdn.net/u014800748/article/details/38407087) 题目简单叙述 题目就是一堆学生他们有清醒的时候和昏迷的时 ...

  3. [刷题]算法竞赛入门经典(第2版) 4-8/UVa12108 - Extraordinarily Tired Students

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa12108 - Extraordinarily Tired Stude ...

  4. Extraordinarily Tired Students UVA - 12108

    不知道叫什么,好像是模拟的方法,看懂了题就好办(英语硬伤←_←) 题意大概是当一个同学想睡觉的时候判断周围睡觉的人数,不睡的人数大于等于睡觉的话就死撑着,否则就睡觉. 一开始没有什么思路,就直接用了个 ...

  5. 【习题 4-8 UVA - 12108】Extraordinarily Tired Students

    [链接] 我是链接,点我呀:) [题意] [题解] 一个单位时间.一个单位时间地模拟就好. 然后对于每个人. 记录它所处的周期下标idx 每个单位时间都会让每个人的idx++ 注意从醒着到睡着的分界线 ...

  6. UVa 12108 特别困的学生

    https://vjudge.net/problem/UVA-12108 题意:给出n个学生的“清醒—睡眠”周期和初始时间点,每个学生在睡眠时需要判断全班睡觉人数是否严格大于清醒人数,否则在坚持一个清 ...

  7. UVa 107 - The Cat in the Hat (找规律,注意精度)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  8. UVA 607 二十二 Scheduling Lectures

    Scheduling Lectures Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submi ...

  9. The Trip PC/UVa IDs: 110103/10137, Popularity: B, Success rate: average Level: 1

    #include<cstdio> #include<iostream> #include<string> #include<algorithm> #in ...

随机推荐

  1. dubbo源码之Directory与LoadBalance

    Directory: 集群目录服务Directory, 代表多个Invoker, 可以看成List<Invoker>,它的值可能是动态变化的比如注册中心推送变更.集群选择调用服务时通过目录 ...

  2. kali linux 信息收集(Kismet)

    1.kismet工具,是一个无线扫描工具,该工具通过测量周围的无线信号,可以扫描到周围附近所用可用的Ap,以及信道等信息.同时还可以捕获网络中的数据包到一个文件中.这样可以方便分析数据包.下面我将详细 ...

  3. Python属性(@property)

    创建用于计算机的属性 在Python中,可以通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性.将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号&q ...

  4. python property的用法

    用法一: class Test(object): def __init__(self): # 私有化 self.__num = 100 #名字重整_Test__num def setNum(self, ...

  5. 读C#开发实战1200例子记录-2017年8月14日10:03:55

    C# 语言基础应用,注释 "///"标记不仅仅可以为代码段添加说明,它还有一项更重要的工作,就是用于生成自动文档.自动文档一般用于描述项目,是项目更加清晰直观.在VisualStu ...

  6. 重排DL

    题解: https://www.luogu.org/problemnew/show/T51442 从这题上还是学到不少东西.. 以前并没有写过ex-bsgs 正好拿这个复习中国剩余定理和bsgs了(我 ...

  7. 强大的xargs

    xargs 命令是最重要的 Linux 命令行技巧之一.你可以使用这个命令将命令的输出作为参数传递给另一个命令.例如,搜索 png 文件然后对其进行压缩或者其它操作: find. -name *.pn ...

  8. 【C#】WebApi 添加过滤器,实现对请求参数和响应内容的日志记录

    filter的介绍 filter在Web API中经常会用到,主要用于记录日志,安全验证,全局错误处理等:Web API提供两种过滤器的基本类型:actionfilterattribute,excep ...

  9. Codeforces 348D Turtles LGV

    Turtles 利用LGV转换成求行列式值. #include<bits/stdc++.h> #define LL long long #define fi first #define s ...

  10. BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...