PTA Advanced 1017 Queueing at Bank C++

测试点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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值