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 }

 

posted @ 2019-02-02 00:14  付玬熙  阅读(207)  评论(0编辑  收藏  举报