标签:如何 str ++ 一个 main begin int 数据 大于
我是不是走火入魔了?(脏话)这题和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 }
标签:如何 str ++ 一个 main begin int 数据 大于
原文地址:https://www.cnblogs.com/wsshub/p/12508246.html