思路:

①用结构体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. kafka消息存储与partition副本原理

    消息的存储原理: 消息的文件存储机制: 前面我们知道了一个 topic 的多个 partition 在物理磁盘上的保存路径,那么我们再来分析日志的存储方式.通过 ll /tmp/kafka-logs/ ...

  2. laravel 路由缓存

    使用路由缓存之前,需要知晓路由缓存只能用于控制器路由,不能用于闭包路由,如果路由定义中包含闭包路由将无法进行路由缓存,只有将所有路由定义转化为控制器路由或资源路由后才能执行路由缓存命令: php ar ...

  3. 停止Monkey

    adb shell top | grep monkey adb shell kill id

  4. 如何在EXCEL中找出第一列中不包含的第二列数据

    1.找出第一列中不包含的第二列数据:=IFERROR(VLOOKUP(A:A,B:B,1,0),"无") 2.A列相同,B列相加:=SUMIF(G:G,G1,J:J)

  5. CTPN项目部分代码学习

    上次拜读了CTPN论文,趁热打铁,今天就从网上找到CTPN 的tensorflow代码实现一下,这里放出大佬的github项目地址:https://github.com/eragonruan/text ...

  6. 华为设备默认console密码

    admin@huawei.com Admin@huawei.com Admin@huawei huawei.com huawei@123 huawei Change_Me

  7. js中匿名函数和回调函数

    匿名函数: 通过这种方式定义的函数:(没有名字的函数) 作用:当它不被赋值给变量单独使用的时候 1.将匿名函数作为参数传递给其他函数 2.定义某个匿名函数来执行某些一次性任务 var f = func ...

  8. python---数学表达式的分析树实现

    先走一遍, 前面很多知道点,都串起来了. # coding = utf-8 # 使用列表实现栈的功能 class Stack: def __init__(self): self.items = [] ...

  9. webpack学习笔记--提取公共代码

    为什么需要提取公共代码 大型网站通常会由多个页面组成,每个页面都是一个独立的单页应用. 但由于所有页面都采用同样的技术栈,以及使用同一套样式代码,这导致这些页面之间有很多相同的代码. 如果每个页面的代 ...

  10. C#学习-类和结构

    类和结构体,对两者进行比较 语法上的区别在于,定义类要使用关键字class,而定义结构体则使用关键字struct; 结构体中不可对声明字段进行初始化,但类可以: 如果没有为类显式地定义构造函数,C#编 ...