思路:

①用结构体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)??。

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

  1 #include "stdio.h"
  2 #include "stdlib.h"
  3 #include "string.h"
  4 #define FIN freopen("input.txt","r",stdin)
  5 #define FOUT freopen("output.txt","w",stdout)
  6 struct stu {
  7     int wake;//清醒时间
  8     int sleep;//睡眠时间
  9     int time;//开始处于的时间
 10     int sta;//状态,1:睡眠;0:清醒
 11     int cnt;//计数器,看看处于某状态的第几个时间段
 12 }stu[10];
 13 char data[10][2002];//表格
 14 int main()
 15 {
 16     //FIN;
 17     //FOUT;
 18     int n, kase = 0;
 19     while (scanf("%d", &n) == 1 && n != 0)
 20     {
 21         kase++;
 22         for (int n2 = 0; n2<n; n2++)
 23         {
 24             scanf("%d%d%d", &stu[n2].wake, &stu[n2].sleep, &stu[n2].time);
 25         }
 26         memset(data, -1, sizeof(data));//初始化
 27         int ans = -1;
 28         for (int i = 0; i<2000; i++)//最多数2000次,如果还找不到就算为无解 ,也是表格的行
 29         {
 30             int wake = 0;
 31             int sleep = 0;
 32             for (int j = 0; j<n; j++)//遍历表格的列
 33             {
 34                 if (i == 0)//i=0无需检查清醒人数和睡眠人数
 35                 {
 36                     if (stu[j].time > stu[j].wake)
 37                     {
 38                         if (stu[j].time >= (stu[j].wake + stu[j].sleep))//处于的时间比清醒和睡眠之和都大,要计算一下
 39                         {
 40                             stu[j].time %= (stu[j].wake + stu[j].sleep);//先取余
 41                         }
 42                         if (stu[j].time == 0)//说明是睡眠的最后一个时间段
 43                         {
 44                             stu[j].cnt = stu[j].sleep;
 45                             stu[j].sta = 1;//睡觉
 46                             for (int l = stu[j].cnt, k = i; l <= stu[j].sleep; l++, k++)//一次性修改
 47                             {
 48                                 data[j][k] = 1;
 49 //                                printf("j=%d k=%d data[%d][%d]=%d\n", j, k, j,k,data[j][k]);
 50                             }
 51                         }
 52                         else
 53                         {
 54                             if (stu[j].time >stu[j].wake)//取余了还是比wake大,就减去wake
 55                             {
 56                                 stu[j].time -= stu[j].wake;
 57                                 stu[j].cnt = stu[j].time;
 58                                 stu[j].sta = 1;//睡觉
 59                                 for (int l = stu[j].cnt, k = i; l <= stu[j].sleep; l++, k++)
 60                                 {
 61                                     data[j][k] = 1;
 62 //                                    printf("i=0 j=%d k=%d data[%d][%d]=%d\n", j, k, j, k, data[j][k]);
 63                                 }
 64                             }
 65                         }
 66                     }
 67                     else
 68                     {
 69                         stu[j].cnt = stu[j].time;
 70                         stu[j].sta = 0;//醒
 71                         for (int l = stu[j].cnt, k = i; l <= stu[j].wake; l++, k++)
 72                         {
 73                             data[j][k] = 0;
 74 //                            printf("i=0 j=%d k=%d data[%d][%d]=%d\n", j, k, j, k, data[j][k]);
 75                         }
 76                     }
 77 //                    printf("stu[%d].cnt=%d stu[%d].sta=%d\n", j, stu[j].cnt, j, stu[j].sta);
 78                 }
 79                 else//i>0
 80                 {
 81                     if (stu[j].sta == 1)//睡觉
 82                     {
 83                         if (stu[j].cnt == stu[j].sleep)
 84                         {
 85                             stu[j].cnt = 1;
 86                             stu[j].sta = 0;//清醒
 87                             for (int l = stu[j].cnt, k = i; l <= stu[j].wake; l++, k++)
 88                             {
 89                                 data[j][k] = 0;//清醒
 90 //                                printf("i>0 j=%d k=%d data[%d][%d]=%d\n", j, k, j, k, data[j][k]);
 91                             }
 92                         }
 93                         else
 94                         {
 95                             stu[j].cnt++;
 96                         }
 97                     }
 98                     else//清醒
 99                     {
100                         int wake = 0, sleep = 0;
101                         for (int k = 0; k < n; k++)
102                         {
103                             if (data[k][i-1] == 1)
104                                 sleep++;
105                             if (data[k][i-1] == 0)
106                                 wake++;
107                         }
108 //                        printf("i=%d wake=%d sleep=%d\n", i - 1, wake, sleep);
109                         if (sleep > wake&&stu[j].cnt == stu[j].wake)//可以睡
110                         {
111                             stu[j].sta = 1;
112                             stu[j].cnt = 1;
113                             for (int l = stu[j].cnt, k = i; l <= stu[j].sleep; l++, k++)
114                             {
115                                 data[j][k] = 1;
116 //                                printf("可以睡 j=%d k=%d data[%d][%d]=%d\n", j, k, j, k, data[j][k]);
117                             }
118                         }
119                         else if(stu[j].cnt==stu[j].wake)//不可以
120                         {
121                             stu[j].cnt = 1;
122                             stu[j].sta = 0;
123                             for (int l = stu[j].cnt, k = i; l <= stu[j].wake; l++, k++)
124                             {
125                                 data[j][k] = 0;
126 //                                printf("不可以睡 j=%d k=%d data[%d][%d]=%d\n", j, k, j, k, data[j][k]);
127                             }
128                         }
129                         else
130                         {
131                             stu[j].cnt++;
132                         }
133                     }
134                 }
135                 wake = 0;
136                 for (int k = 0; k<n; k++)
137                 {
138                     if (data[k][i] == 0)
139                         wake++;
140                 }
141                 if (wake == n)
142                 {
143 //                    printf("wake=n i=%d\n", i + 1);
144                     ans = i+1;
145                     break;
146                 }
147             }
148             if (ans != -1)
149             {
150                 break;
151             }
152         }
153         printf("Case %d: %d\n",kase,ans);
154
155     }
156     return 0;
157 }

转载于:https://www.cnblogs.com/fudanxi/p/10347366.html

UVA 12108 Extraordinarily Tired Students相关推荐

  1. UVA - 12108 Extraordinarily Tired Students(特别困的学生)

    题目链接UVA - 12108 题目思路: 用f[i]来纪录每个学生当前的状态(是否睡觉) 用now[i]来纪录每个学生处于当前状态的总时间 用first[i]来纪录所有学生最初时处于第几分钟,用于循 ...

  2. uva 12108 Extraordinarily Tired Students(特别困的学生)

    题目大意: 课堂上有n(n<=10)个学生,每个学生都有一个"睡眠-清醒""周期,其中第i个学生清醒Ai分钟后睡Bi分钟,然后重复(1<=Ai,Bi<= ...

  3. UVa 12108 - Extraordinarily Tired Students(模拟+细节处理)

    输入每个学生的睡眠-清醒周期和当前状态,每个学生在睡觉前都会检查班里人的状态,仅当睡眠人数严格大于清醒人数时才会睡觉,否则继续保持清醒状态持续一个周期.求学生全部清醒的时刻,不存在则输出-1. 现在看 ...

  4. 12108 - Extraordinarily Tired Students(特别困的学生)

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

  5. 12108 - Extraordinarily Tired Students

    水题一遍A,不过要注意一下每个同学临睡前的情况,根据样例就能知道,好好研究样例即可. #include<stdio.h> #include<string.h> int a[15 ...

  6. UVA12108-4.8(ti)-Extraordinarily Tired Students

    UVA12108-4.8(ti)-Extraordinarily Tired Students 题目描述: https://uva.onlinejudge.org/index.php?option=c ...

  7. HDU 2932 Extraordinarily Tired Students (暴力+取模还是很强大的)

    题目链接:HDU 2932 Extraordinarily Tired Students 题意:给出N个学生的状态,(a,b,c).a表示a分钟这醒着,b表示b分钟睡着,c表示刚开始是重周期(a+b) ...

  8. Extraordinarily Tired Students, UVA - 12108(模拟)

    #include<iostream> #include<cstring> #include<cstdio> using namespace std; int top ...

  9. 特别困的学生(Extraordinarily Tired Students, ACM/ICPC Xi'an 2006, UVa12108)

    #include <cstdio> #include<iostream> using namespace std;struct student {int wake;int sl ...

最新文章

  1. linux下Vi编辑器命令大全
  2. 寒假每日一题(入门组)【week1 完结】
  3. python的特殊类_python - 类的特殊成员方法
  4. 【数据结构与算法】之深入解析“打家劫舍”的求解思路与算法示例
  5. NUMPY数据集练习 ----------SKLEARN类
  6. 二叉搜索时与双向链表python_【剑指offer】26 二叉搜索树与双向链表
  7. Goalng小demo一:家庭收支记账软件项目
  8. 时间格式转换y-m-d
  9. 设计模式笔记二十一:状态模式
  10. pycharm运行pytorch版pix2pix学习笔记
  11. 关于ADO.Net连接池(Connection Pool)的一些个人见解
  12. 我得新博客上线了采用Vue+Layui的结合开发,后台采用asp.net mvc
  13. PMP考试-风险管理专项突破(第六版)
  14. Qt更改字体为思源黑体
  15. Android Studio实现中华字典APP
  16. 石家庄网站建设公司详解企业网站建设方案策划
  17. python中mod函数用法_python divmod函数是如何使用的?
  18. 朋友圈加粗字体数字_报名 | 零基础入门brush lettering英文花式字体
  19. 苹果手机其他占内存很大去哪删除_手机没内存,照片又不舍得删除?这里有6大方法能帮你解决!...
  20. R语言数据科学程序包:Tidyverse介绍

热门文章

  1. SharePoint 2013 场解决方案包含第三方程序集
  2. 【openSUSE】软件源和软件搜索
  3. hdu 2871 Memory Control(线段树)
  4. 安装SCOM Reporting Server
  5. JQ插件的写法及使用整理
  6. PHP修改PHP.ini上传大文件的解决办法
  7. Go语言 ProtoBuf 序列化和反序列化
  8. double类型计算
  9. 大道至简阅读笔记01
  10. 小程序外接web-view坑------alert显示域名