思路:

①用结构体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. RabbitMQ疑惑释义

    MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序之间 ...

  2. Oracle查询CLOB字段类型的内容

    select dbms_lob.substr(lo.ldtext) as text from longdescription lo

  3. MyBatis - 10.MyBatis扩展

    1.PageHelpler分页插件使用 官方文档:中文 1.1 引入插件 1.1.1 引入的jar pagehelper-5.1.6.jar jsqlparser-1.2.jar 1.1.2 mave ...

  4. 【BZOJ3252】攻略

    题解: 首先贪心的会发现我们每次一定会选当前权值和最大的那个 然后在于怎么维护这个最大值 我们发现每个修改实际上是对沿途所有点的子树的修改 所以用线段树维护就可以了.. 另外注意有重复部分,但一定是包 ...

  5. noip2012

    题解: 闲着无聊做了一遍noip2012 我觉得出题出的好奇怪啊... 为什么两道倍增两道二分答案??? 两天第一题: 第一天第一题傻逼普及组题没什么好说的了 第二天第一题你会扩欧就秒了 两天第二题: ...

  6. Introduction to boundary integral equations in BEM

    Boundary element method (BEM) is an effective tool compared to finite element method (FEM) for resol ...

  7. nginx做代理安装docker

    1.环境 服务器IP 服务用途 是否能 联网 192.168.126.128 docker服务器(简称B服务器) 不能 192.168.126.130 nginx服务器(简称A服务器) 能 2.背景 ...

  8. 总结Flink状态管理和容错机制

    本文来自8月11日在北京举行的 Flink Meetup会议,分享来自于施晓罡,目前在阿里大数据团队部从事Blink方面的研发,现在主要负责Blink状态管理和容错相关技术的研发.   本文主要内容如 ...

  9. MySQL安装教程图解

    核心提示:下面的是MySQL安装的图解,用的可执行文件安装的,详细说明了一下! 下面的是MySQL安装的图解,用的可执行文件安装的,详细说明了一下! MySQL下载地址 打开下载的mysql安装文件m ...

  10. HDU5470 Typewriter SAM 动态规划 单调队列

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU5470.html 题目传送门 - HDU5470 题意 你需要写一个只包含小写字母的字符串 $s$ . 你 ...