UVA 12108 Extraordinarily Tired Students
Posted fudanxi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ", 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 ", 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 ", j, k, j, k, data[j][k]); 75 } 76 } 77 // printf("stu[%d].cnt=%d stu[%d].sta=%d ", 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 ", 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 ", 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 ", 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 ", 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 ", i + 1); 144 ans = i+1; 145 break; 146 } 147 } 148 if (ans != -1) 149 { 150 break; 151 } 152 } 153 printf("Case %d: %d ",kase,ans); 154 155 } 156 return 0; 157 }
以上是关于UVA 12108 Extraordinarily Tired Students的主要内容,如果未能解决你的问题,请参考以下文章