思路:

①用结构体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. HTML&javaSkcript&CSS&jQuery&ajax(七)

    ’一.HTML5 实例  <video width="430" controls>   <source src="mov_nnn.mp4" t ...

  2. 使用Ultra Librarian将bxl文件转为OrCAD Capture CIS可识别的库文件(OLB)

    操作系统:Windows 10 x64 工具1:Ultra Librarian 8.3.89 工具2:OrCAD Capture CIS 16.6-S062 (v16-6-112FF) 关于Ultra ...

  3. AI学习吧-购物车-添加商品接口

    create接口流程 需求:向购物车添加商品 流程:写shopping_cart路由--->写ShoppingCart视图函数--->使用Authuser校验用户是否登录--->首先 ...

  4. map reduce程序示例

    map reduce程序示例 package test2; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop. ...

  5. Python 9*9口诀

    #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:Liuyoushui # Time = 2017/7/18 10:33 print ('\n ...

  6. python datetime.datetime is not JSON serializable

    1.主要是python  list转换成json时对时间报错:datetime.datetime(2014, 5, 23, 9, 33, 3) is not JSON serializable. 2. ...

  7. requests之json系列(一)

    以post方式获取接口指定的相关信息 #! /usr/bin/env python # coding=utf-8 import json import urllib import requests i ...

  8. [转]docker安装elk

    来源 https://www.jianshu.com/p/f549017c4b60   问题:virtual memory areas vm.max_map_count [65530] likely ...

  9. python函数默认参数为可变对象的理解

    1.代码在执行的过程中,遇到函数定义,初始化函数生成存储函数名,默认参数初识值,函数地址的函数对象. 2.代码执行不在初始化函数,而是直接执行函数体. 代码实例 这要从函数的特性说起,在 Python ...

  10. Codeforces 354B dp Game with Strings dp

    Game with Strings 题意并不是在图上走,看了好久才看出来.. dp[ i ][ mask ]表示从 i 层开始走,起点有mask个, a的个数-b的个数的  最大值或者最小值. #in ...