记一个坑,银行上午8点到下午5点关门,我的认知是:5点以后来或者5点后还不能得到服务的人要从总人数里删去。然而,这道题它认为5点前来的人都计入总的服务了的人数 ,哪怕你等到5点后才得到服务,但是5点后来的就不行。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
struct Person{
string arrive;
int h,m,s,last;
Person(){}
Person(string arrive,int last){
this->arrive = arrive;
this->last = last;
sscanf(arrive.c_str(),"%d:%d:%d",&h,&m,&s);
}
};
vector<Person> v;
int window[101]={0};
int n,k;
int getwin(){
int min = window[0];
int index = 0;
for(int i=1;i<k;i++){
if(window[i] < min){
index = i;
min = window[i];
}
}
return index;
}
bool cmp(Person p1,Person p2){
return p1.arrive <p2.arrive;
}
int main()
{
scanf("%d%d",&n,&k);
string arrive;
int last;
for(int i=0;i<n;i++){
cin>>arrive>>last;
if(last > 60) last = 60;
v.push_back(Person(arrive,last));
}
for(int i=0;i<k;i++)
window[i] = 3600*8;
sort(v.begin(),v.end(),cmp);
int index = 0;
float acc = 0;//acumulate time
int server = n;
while(index < n){
int win = getwin();
int arriveTime = 3600*v[index].h+60*v[index].m+v[index].s;//start from 00:00:00
if(arriveTime >3600*(12+5)){
server--;//超过时间段,服务人数减一
}else if(window[win] < arriveTime){
window[win] = arriveTime+v[index].last*60;
}else{
acc+= window[win] - arriveTime;
window[win] += v[index].last*60;
}
index++;
}
if(server != 0)
printf("%.1f\n",acc/60/server);
else
printf("0.0\n");
return 0;
}