1. 程式人生 > >UVA 12108 Extraordinarily Tired Students

UVA 12108 Extraordinarily Tired Students

pan inpu open time sizeof 初始 red nts 睡眠

思路:

①用結構體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 }

UVA 12108 Extraordinarily Tired Students