测试点3,4,5过不了
#include <iostream>
#include <string>
#include <bits/stdc++.h>
#include <queue>
#include <iomanip>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int turnStringTimeToSecondTime(string stringTime){
// test
// cout<<"hh:"<<stringTime.substr(0,2)<<",mm:"<<stringTime.substr(2,2)<<",ss:"<<stringTime.substr(4,2)<<endl;
// 获取时分秒
int hh=stoi(stringTime.substr(0,2));
int mm=stoi(stringTime.substr(3,2));
int ss=stoi(stringTime.substr(6,2));
return ss+mm*60+hh*60*60;
}
// 自定义的比较函数
bool cmp(const pair<int,int> &p1,const pair<int,int> &p2){
return p1.first<p2.first;
}
// 记录每个队伍结束上一个用户的服务后的时间(队伍编号从0开始)
int finishLastUserTime[100];
int finishThisUserTime[100];// 结束当前用户的服务后
int window[100];// 记录当前窗口处的用户业务办理时间
// 从finishThisUserTime中找到最早的时间的队伍
int getQuickSpareQueue(int k){
int earlistTime=0x7fffffff,windowId=-1;
for(int i=0;i<k;i++){
// test
// cout<<"处理后的时间为:"<<finishThisUserTime[i]<<endl;
if(finishThisUserTime[i]<earlistTime){
earlistTime=finishThisUserTime[i];
windowId=i;
}
}
return windowId;
}
int main(int argc, char** argv) {
int n,k;// n:用户人数;k:窗口数
cin>>n>>k;
vector<pair<int,int>> userMsg;// 存放用户的到达时间和处理时间
for(int i=0;i<n;i++){
string arriveTime;// 到达时间
int processTime;// 处理时间(单位:分钟)
cin>>arriveTime>>processTime;
// 将到达时间换算成秒
int secondTime=turnStringTimeToSecondTime(arriveTime);
// 如果到达时间在17:00:00之后则不会办理
if(secondTime>=17*60*60) continue;
userMsg.push_back(make_pair(secondTime,processTime*60));
}
// 按照时间先后顺序将用户排队
sort(userMsg.begin(),userMsg.end(),cmp);
// test
// for(int i=0;i<userMsg.size();i++){
// cout<<userMsg[i].first<<" "<<userMsg[i].second<<endl;
// }
int waitSecondTime=0;// 总共的等待时间(单位:秒)
int processedUserNum=0;// 可以办理用户人数
fill(finishLastUserTime,finishLastUserTime+k,8*60*60);
for(int i=0;i<userMsg.size();i++){
int iQueue;
// 前k个用户可以直接在k个窗口处办理业务
if(i<k){
iQueue=i%k;
} else{// 计算得出最早空闲的队伍
// 假设所有队伍都处理完当前用户的业务后
for(int j=0;j<k;j++){
finishThisUserTime[j]=finishLastUserTime[j]+window[j];
}
iQueue=getQuickSpareQueue(k);
}
// 让该队伍的用户办理结束,当前用户进入队伍
finishLastUserTime[iQueue]+=window[iQueue];
window[iQueue]=userMsg[i].second;
// test
// cout<<"当前用户排在的窗口为:"<<iQueue<<endl;
// test
// cout<<"当前用户的开始时间:"<<finishLastUserTime[iQueue]<<endl;
// cout<<"当前用户的到达时间:"<<userMsg[i].first<<endl;
// 如果开始时间是在17:00:00之后,则该业务也无法处理
if(finishLastUserTime[iQueue]>=17*60*60) break;
// 计算等待时间
int thisUserWaitTime=finishLastUserTime[iQueue]-userMsg[i].first;
if(thisUserWaitTime>0){
waitSecondTime+=thisUserWaitTime;
}
processedUserNum++;
}
// 计算平均时间
cout<<fixed<<setprecision(1)<<waitSecondTime/processedUserNum/60.0;
return 0;
}