1017. Queueing at Bank (25)

点击打开链接

找不到哪里错了,有3个点不过

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int n,w;
struct mytime{
	int hh,mm,ss;
};
struct node{
	mytime come;
	mytime start;
	mytime fin;
	int last;
}no[10010];
vector <int> window[110];
bool cmp(node a,node b){
	if(a.come.hh!=b.come.hh){
		return a.come.hh<b.come.hh;
	}else{
		if(a.come.mm!=b.come.mm){
			return a.come.mm<b.come.mm;
		}else{
			return a.come.ss<b.come.ss;
		}
	}
}
//共有多少人成功办理业务,进队就成功办理业务了
int cnt=0;
//等待时间的总和
double ans=0;
//计算结束时间
mytime calfin(int last,mytime start){
	if(last>60){
		last=60;
	}
	mytime t;
	t.ss=start.ss;
	t.mm=(start.mm+last)%60;
	t.hh=start.hh+(start.mm+last)/60;
	return t;
}
//计算等待时间,化为秒
int callast(mytime come,mytime start){
	int ans=0;
	if(start.ss-come.ss<0){
		start.mm--;
		start.ss+=60;
	}
	if(start.mm-come.mm<0){
		start.hh--;
		start.mm+=60;
	}
	ans=start.ss-come.ss+(start.mm-come.mm)*60+(start.hh-come.hh)*60*60;
	return ans;

}
//判断哪个time大小,prior小返回true,cur小返回false,相等返回false

bool compare(mytime prior,mytime cur){
	if(prior.hh<cur.hh){
		return true;
	}else if(prior.hh==cur.hh){
		if(prior.mm<cur.mm){
			return true;
		}else if(prior.mm>cur.mm){
			return false;
		}else{
			if(prior.ss<cur.ss){
				return true;
			}else if(prior.ss>=cur.ss){
				return false;
			}
		}
	}else{
		return false;
	}
	
}
//找到最快结束的队伍
int findq(){
	int ans=0;
	mytime quick=no[ window[0][window[0].size()-1]].fin;
	for(int i=1;i<w;i++){
		if(!compare(quick,no[ window[i][window[i].size()-1]].fin)){
			quick=no[ window[i][window[i].size()-1]].fin;
			ans=i;
			
		}
	}
	return ans;
}
//进队
void inq(int i){
	mytime early;
	early.hh=17;
	early.mm=0;
	early.ss=0;
	if(compare(early,no[i].come)){
		return;
	}
	for(int win=0;win<w;win++){
		if(window[win].empty()){
			window[win].push_back(i);
			cnt++;
			if(no[i].come.hh<8){
				no[i].start.hh=8;
				no[i].start.mm=0;
				no[i].start.ss=0;
			}else{
				no[i].start=no[i].come;
			}
			no[i].fin=calfin(no[i].last,no[i].start);
			ans+=callast(no[i].come,no[i].start);
			return;
		}
	}

	int curw=findq();
	cnt++;
	mytime rear=no[ window[curw][ window[curw].size()-1] ].fin;
	no[i].start=rear;
	no[i].fin=calfin(no[i].last,no[i].start);
	ans+=callast(no[i].come,no[i].start);
	window[curw].push_back(i);
	return;
}
int main(){
	freopen("in.txt","r",stdin);
	
	scanf("%d %d",&n,&w);
	for(int i=0;i<n;i++){
		scanf("%d:%d:%d %d",&no[i].come.hh,&no[i].come.mm,&no[i].come.ss,&no[i].last);
	}
	sort(no,no+n,cmp);
	for(int i=0;i<n;i++){
		inq(i);	
	}
	ans/=(double)cnt;
	printf("%.1lf\n",ans/60);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值