思路:

①用结构体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. requests 的基本用法

    r = requests.get('www.baidu.com') r.request.headers{'User-Agent': 'python-requests/2.18.4', 'Accept- ...

  2. Python交换a,b两个数值的三种方式

    # coding:utf-8 a = 1 b = 2 # 第一种方式 # t = a # 临时存放变量值 # a = b # b = t # 第二种方式 # a = a + b # a的值已经不是原始 ...

  3. Python笔记记录

    python2和python3的不同: Unicode(统一码.万国码),在3里面可以直接写中文了. python2里rae_input与python3中的input效果一样 在计算机内存中,统一用U ...

  4. C++ Primer 笔记——const 限定符

    1.因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化. 2.默认情况下const对象只在文件内有效,如果想在多个文件之间共享const对象,必须在变量的定义之前添加exter ...

  5. OpenCV-Python入门教程3-图像基本操作(访问像素点/ROI/通道分离)

    一.获取和修改像素点的值 import cv2img = cv2.imread('lena.jpg') # 100, 90表示行列坐标 px = img[100, 90] print(px) # 获取 ...

  6. python 内建函数

    # # __geratteibute__class Itcast(object): def __init__(self,subject1): self.subject1 = subject1 self ...

  7. k8s 1.12.6版的kubeadm默认配置文件

    这个对于提高安装配置的便捷性,相当有帮助. 命令如下: kubeadm config print-default 输出如下: apiEndpoint: advertiseAddress: 1.2.3. ...

  8. 一脸懵逼学习KafKa集群的安装搭建--(一种高吞吐量的分布式发布订阅消息系统)

    kafka的前言知识: :Kafka是什么? 在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算.kafka是一个生产-消费模型. Producer:生产者,只负责数 ...

  9. WPF在XAML中实现持续动画的暂停、恢复、停止

    1.动画通过EventTrigger监听按钮的FrameworkElement.Loaded事件,但控件载入时就进行动画, 持续动画通过<BeginStoryboard Name="y ...

  10. C# 之 判断一个字符是否是汉字

    判断一个字符是不是汉字通常有三种方法: [1] 用 ASCII 码判断:[2] 用汉字的 UNICODE 编码范围判断:[3] 用正则表达式判断. 1.用ASCII码判断 在 ASCII码表中,英文的 ...