PAT1026

题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1026

注意几点:1.21点包括21点来的都不给服务。 2.最多玩2小时    

特别注意几点: 1.if there are some tables open when they arrive, they will be assigned to the available table with the smallest number. 与  if when it is the turn of a VIP pair, yet no VIP table is available, they can be assigned as any ordinary players.  就是当有普通桌子 和  vip桌子同时 空闲时, vip优先选vip桌子!

2.   The waiting time must be rounded up to an integer minute(s).   这里指的四舍五入(最后一个case就是这个坑)。3.注意处理关了门,但是还没玩完的。

 

  1 #include<iostream>
  2 #include<vector>
  3 #include<string>
  4 #include<queue>
  5 #include<algorithm>
  6 using namespace std;
  7 
  8 struct Players
  9 {
 10     string arrivetime;
 11     string servingtime;
 12     int playingtime;
 13     int vip;
 14 };
 15 
 16 struct Tables
 17 {
 18     int vip;
 19     int servednums;
 20     queue<Players> table;
 21 }t1={0,0};
 22 
 23 bool comp(Players p1, Players p2)
 24 {
 25     if(p1.arrivetime < p2.arrivetime)
 26         return true;
 27     else
 28         return false;
 29 }
 30 
 31 bool comp1(Players p1, Players p2)
 32 {
 33     if(p1.servingtime < p2.servingtime)
 34         return true;
 35     else
 36         return false;
 37 }
 38 
 39 int date2second(string end, string start)
 40 {
 41     int hh(0), mm(0), ss(0);
 42     for(int i=0; i<3; ++i)
 43          if(i == 0)     
 44          { 
 45              ss = (end[6]-start[6])*10 + (end[7]-start[7]);
 46              if(ss < 0 )
 47              {--mm; ss +=60;}
 48          }
 49          else if(i == 1)
 50          {
 51              mm += (end[3]-start[3])*10 + (end[4]-start[4]);
 52              if(mm < 0)
 53                  {--hh; mm+=60;}        
 54          }
 55          else
 56              hh +=  (end[0]-start[0])*10 + (end[1]-start[1]);
 57     int sec = hh*3600+mm*60+ss;
 58     if(sec%60 == 0)
 59         return sec/60;
 60     else if(sec%60 >= 30)
 61         return sec/60 +1;
 62     else
 63         return sec/60;
 64     /*两个时间点之间差的时间, sec秒数*/
 65 }
 66 
 67 /*时间加1秒 然后返回string*/
 68 string plus1ss(string s)
 69 {
 70     s[7] = (char)((s[7]-'0'+1) + '0');
 71     if(s[7] > '9')
 72     {
 73         s[7] ='0';
 74         s[6] = (char)((s[6]-'0'+1) + '0');
 75     }
 76     if(s[6] == '6')
 77     {
 78         s[6] = '0';
 79         s[4] = (char)((s[4]-'0'+1) + '0');
 80     }
 81     if(s[4] > '9')
 82     {
 83         s[4] ='0';
 84         s[3] = (char)((s[3]-'0'+1) + '0');
 85     }
 86     if(s[3] == '6')
 87     {
 88         s[3] = '0';
 89         s[1] = (char)((s[1]-'0'+1) + '0');
 90     }
 91     if(s[1] > '9')
 92     {
 93         s[1] = '0';
 94         s[0] = (char)((s[0]-'0'+1) + '0');
 95     }
 96     return s;
 97 }
 98 
 99 int main()
100 {
101     int N;
102     while(cin>>N)
103     {
104         queue<Players> ordinary;
105         queue<Players> vip;
106         vector<Players> temp;
107         for(int i=0; i<N; ++i)
108         {
109             string at; int pt, tag;
110             cin>>at>>pt>>tag;
111             if(at < "21:00:00" && at >= "08:00:00")
112             {
113                 if(pt > 120)
114                     pt = 120*60;
115                 else
116                     pt = pt*60;
117                 Players p={at, "", pt, tag};
118                 temp.push_back(p);
119             }
120         }
121         sort(temp.begin(), temp.end(), comp);
122         for(int i=0; i<temp.size(); ++i)
123             if(temp[i].vip == 0)
124                 ordinary.push(temp[i]);
125             else
126                 vip.push(temp[i]);
127         int K, M; cin>>K>>M;
128         vector<Tables> tb(K, t1);
129 
130         for(int i=0; i<M; ++i)
131         {
132             int a; cin>>a;
133             tb[a-1].vip = 1;
134         }
135         temp.clear();
136         string time("08:00:00");
137         while(time < "21:00:00" )
138         {
139             /*先遍历下,给vip分配桌子*/
140             for(int i=0; i<tb.size(); ++i)
141                 if(tb[i].table.empty() && tb[i].vip == 1 && !vip.empty() && vip.front().arrivetime <= time)
142                 {
143                     vip.front().servingtime = time;
144                     tb[i].table.push(vip.front());
145                     vip.pop();
146                 }
147             /*普通分配*/
148             for(int i=0; i<tb.size(); ++i)
149                 if(tb[i].table.empty())
150                     if(!vip.empty() && !ordinary.empty())
151                     {
152                         if(vip.front().arrivetime < ordinary.front().arrivetime && vip.front().arrivetime <= time)
153                         {
154                                 vip.front().servingtime = time;
155                                 tb[i].table.push(vip.front());
156                                 vip.pop();
157                         }
158                         else if(ordinary.front().arrivetime <= time)
159                         {
160                                 ordinary.front().servingtime = time;
161                                 tb[i].table.push(ordinary.front());
162                                 ordinary.pop();
163                         }
164                     }
165                     else if(vip.empty() && !ordinary.empty())
166                     {
167                         if(ordinary.front().arrivetime <= time)
168                             {
169                                  ordinary.front().servingtime = time;
170                                 tb[i].table.push(ordinary.front());
171                                 ordinary.pop();
172                             }
173                     }
174                     else if(!vip.empty() && ordinary.empty())
175                     {
176                         if(vip.front().arrivetime <= time)
177                             {
178                                 vip.front().servingtime = time;
179                                 tb[i].table.push(vip.front());
180                                 vip.pop();
181                             }
182                     }
183             time = plus1ss(time);
184             for(int i=0; i<tb.size(); ++i)
185                 if(!tb[i].table.empty())
186                     if(--tb[i].table.front().playingtime == 0)
187                     {
188                         temp.push_back(tb[i].table.front());
189                         tb[i].table.pop();
190                         ++tb[i].servednums;
191                     }
192         }
193         /*处理关了门,但是还没玩完的*/
194         for(int i=0; i<tb.size(); ++i)
195             if(!tb[i].table.empty())
196             {    
197                 temp.push_back(tb[i].table.front());
198                 ++tb[i].servednums;
199             }
200         sort(temp.begin(), temp.end(), comp1);
201         for(int i=0; i<temp.size(); ++i)
202             cout<<temp[i].arrivetime<<" "<<temp[i].servingtime<<" "
203             <<date2second(temp[i].servingtime, temp[i].arrivetime)<<endl;
204         for(int i=0; i<tb.size()-1; ++i)
205             cout<<tb[i].servednums<<" ";
206         cout<<tb[tb.size()-1].servednums<<endl;
207     }
208     return 0;
209 }

 

posted @ 2013-10-17 22:16  coding_monkey  阅读(408)  评论(0编辑  收藏  举报