题目链接
- 简单的模拟题
- 注意等待时间的单位是min
- 5点以后的不用算作求平均等待时间的人数
using namespace std;
struct customer{
int arr;
int last;
};
int n,k,act;
int win[111];
customer cus[10100];
bool cmp(customer a,customer b)
{
return a.arr<b.arr;
}
int getmin(int x)
{
int i,j,k;
j=maxn;
for(i=0;i<x;i++)
{
if(win[i]<j)
{
j=win[i];
k=i;
}
}
return k;
}
int getans(int arrtime,int i,int lasttime)
{
int wait;
if(arrtime>17*3600)
{
act--;
wait=0;
}
else if(arrtime>=win[i])
{
wait=0;
win[i]=arrtime+lasttime;
}
else if(arrtime<win[i])
{
wait=win[i]-arrtime;
win[i]+=lasttime;
}
return wait;
}
int main()
{
int i,j,l;
int hh,mm,ss;
char time[25];
scanf("%d %d",&n,&k);
for(i=0;i<n;i++)
{
scanf("%s",time);
hh=(time[0]-'0')*10+(time[1]-'0');
mm=(time[3]-'0')*10+(time[4]-'0');
ss=(time[6]-'0')*10+(time[7]-'0');
cus[i].arr=hh*3600+mm*60+ss;
scanf("%d",&j);
cus[i].last=j*60;
// printf("%d %d\n",cus[i].arr,cus[i].last);
}
sort(cus,cus+n,cmp);
for(i=0;i<k;i++)
win[i]=8*3600;
i=0;
float wait=0;
act=n;
while(i<n)
{
l=getmin(k);
j=getans(cus[i].arr,l,cus[i].last);
// printf("%d\n",j);
wait+=j;
i++;
}
printf("%.1f",wait/(60*act));
}