1017 Queueing at Bank (25分)

Posted wsshub

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1017 Queueing at Bank (25分)相关的知识,希望对你有一定的参考价值。

 

技术图片

 

 我是不是走火入魔了?(脏话)这题和1014很像,思路也差不多,自己把总体思路写下来了,一直不通过,是自己都没想明白window[]数组里面存的应该是什么,脑子稀里糊涂,明明想到了,却又被别的想法给搅乱,错就错在window[]的定义自己没想明白。

1.将时间转化为秒进行比较和运算。

2.每个人拥有2个数据,一个是到达时间,1个是业务处理时间。由于是乱序输入,应该根据到达时间对人进行排序,排成一队,一个一个处理。

3.window[i]存的是,第i个窗口前一个人业务处理完毕的时间。如何更新这个值?一,当前的客户到达时间比window[i]小,说明早到了,等待时间为这两者之差,更新window[i]为原来的值+当前客户的业务处理时间,即前面的人的处理完毕的时间是window[i],那有人紧接着他等待被服务,下一个window[i]自然就是加上紧接着的人的处理业务的时间;二,如果当下一个人的到达时间大于等于window[i],说明不用等待,更新window[i]为到达时间与业务处理时间之和。

4.太懵了,乱七八糟说了啥?是不是因为今天没睡够?改着改着我居然还因为只有测试点0没通过找半天bug(懒得猜测试点是啥了,错在对八点之前到达的人的处理,具体是啥不知道),很烦。以后每天只做1个半小时的oj,耗着也不是事。宁可把时间花在数学和英语。(脏话)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<algorithm>
 5 using namespace std;
 6 struct Cus{
 7     int P;//业务时间 
 8     int arrive; 
 9     Cus(){P=arrive=0;
10     }
11 };
12 bool cmp(Cus a,Cus b){
13     return a.arrive<b.arrive;
14 }
15 int main(){ 
16     int N,K,P; 
17     int hh,mm,ss;
18     int cnt=0;
19     scanf("%d%d",&N,&K);
20     vector<Cus> Que;
21     vector<int> window(K,28800);
22     vector<double> res(N,0);
23     for(int i=0;i<N;i++){
24         Cus cus;
25         scanf("%d:%d:%d%d",&hh,&mm,&ss,&P);
26         int Second=0;
27         Second=(hh*3600+mm*60+ss);
28         cus.P=P*60;
29         if(P>3600)
30            cus.P=3600; 
31         if(Second>61200)//下午五点 
32             continue;
33         cus.arrive=Second;
34         Que.push_back(cus) ; 
35     }
36     int size=Que.size();
37     sort(Que.begin(),Que.end(),cmp);
38     
39    while(cnt<size) 
40     { int minwindow=0;
41       int min=window[minwindow];
42       for(int i=1;i<K;i++){
43           if(min>window[i]){
44               minwindow=i;
45               min=window[minwindow];
46           }
47       }
48     
49       if(Que[cnt].arrive<window[minwindow])
50           {res[cnt]=window[minwindow]-Que[cnt].arrive;
51            window[minwindow]+=Que[cnt].P; 
52           } 
53       else
54            window[minwindow]=Que[cnt].arrive+Que[cnt].P; 
55       cnt++;
56     }
57     double sum=0;
58     for(int i=0;i<size;i++)
59       sum+=res[i];
60     
61     if(size==0)
62         printf("0.0");
63     else
64        printf("%.1f",sum/size/60);
65     return 0;
66 }

 

以上是关于1017 Queueing at Bank (25分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1017 Queueing at Bank (25) (坑题)

PAT 1017 Queueing at Bank

1017 Queueing at Bank (25分) 思路详解+满分代码

1017 Queueing at Bank (25分) 思路详解+满分代码

PAT 1017 Queueing at Bank[一般]

1017 Queueing at Bank (25 分) 未完成难度: 中 / 知识点: 模拟