UVA 12108 Extraordinarily Tired Students
思路:
①用结构体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相关推荐
- UVA - 12108 Extraordinarily Tired Students(特别困的学生)
题目链接UVA - 12108 题目思路: 用f[i]来纪录每个学生当前的状态(是否睡觉) 用now[i]来纪录每个学生处于当前状态的总时间 用first[i]来纪录所有学生最初时处于第几分钟,用于循 ...
- uva 12108 Extraordinarily Tired Students(特别困的学生)
题目大意: 课堂上有n(n<=10)个学生,每个学生都有一个"睡眠-清醒""周期,其中第i个学生清醒Ai分钟后睡Bi分钟,然后重复(1<=Ai,Bi<= ...
- UVa 12108 - Extraordinarily Tired Students(模拟+细节处理)
输入每个学生的睡眠-清醒周期和当前状态,每个学生在睡觉前都会检查班里人的状态,仅当睡眠人数严格大于清醒人数时才会睡觉,否则继续保持清醒状态持续一个周期.求学生全部清醒的时刻,不存在则输出-1. 现在看 ...
- 12108 - Extraordinarily Tired Students(特别困的学生)
题目: When a student is too tired, he can't help sleeping in class, even if his favorite teacher is ri ...
- 12108 - Extraordinarily Tired Students
水题一遍A,不过要注意一下每个同学临睡前的情况,根据样例就能知道,好好研究样例即可. #include<stdio.h> #include<string.h> int a[15 ...
- UVA12108-4.8(ti)-Extraordinarily Tired Students
UVA12108-4.8(ti)-Extraordinarily Tired Students 题目描述: https://uva.onlinejudge.org/index.php?option=c ...
- HDU 2932 Extraordinarily Tired Students (暴力+取模还是很强大的)
题目链接:HDU 2932 Extraordinarily Tired Students 题意:给出N个学生的状态,(a,b,c).a表示a分钟这醒着,b表示b分钟睡着,c表示刚开始是重周期(a+b) ...
- Extraordinarily Tired Students, UVA - 12108(模拟)
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int top ...
- 特别困的学生(Extraordinarily Tired Students, ACM/ICPC Xi'an 2006, UVa12108)
#include <cstdio> #include<iostream> using namespace std;struct student {int wake;int sl ...
最新文章
- linux下Vi编辑器命令大全
- 寒假每日一题(入门组)【week1 完结】
- python的特殊类_python - 类的特殊成员方法
- 【数据结构与算法】之深入解析“打家劫舍”的求解思路与算法示例
- NUMPY数据集练习 ----------SKLEARN类
- 二叉搜索时与双向链表python_【剑指offer】26 二叉搜索树与双向链表
- Goalng小demo一:家庭收支记账软件项目
- 时间格式转换y-m-d
- 设计模式笔记二十一:状态模式
- pycharm运行pytorch版pix2pix学习笔记
- 关于ADO.Net连接池(Connection Pool)的一些个人见解
- 我得新博客上线了采用Vue+Layui的结合开发,后台采用asp.net mvc
- PMP考试-风险管理专项突破(第六版)
- Qt更改字体为思源黑体
- Android Studio实现中华字典APP
- 石家庄网站建设公司详解企业网站建设方案策划
- python中mod函数用法_python divmod函数是如何使用的?
- 朋友圈加粗字体数字_报名 | 零基础入门brush lettering英文花式字体
- 苹果手机其他占内存很大去哪删除_手机没内存,照片又不舍得删除?这里有6大方法能帮你解决!...
- R语言数据科学程序包:Tidyverse介绍