题目大意:排队问题。窗口空,如果有等待顾客则上去办理业务。
解题思路:简单的模拟,详细看代码
题目链接:https://www.patest.cn/contests/pat-a-practise/1017
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
using namespace std;
typedef struct Info{
int time,workTime,waitTime;
}Info;
Info clientInfo[10005];
int window[101];//记录窗口还需要多少时间不忙
bool cmp(Info x1,Info x2)
{
if(x1.time < x2.time)
return true;
return false;
}
int main(int argc, char** argv) {
int n, k;
cin >> n >> k;
fill(window,window+105,0);
for(int i=0;i<n;++i)
{
int wt,hh,mm,ss;
scanf("%d:%d:%d %d",&hh,&mm,&ss,&wt);
clientInfo[i].time = hh*3600+mm*60+ss;//以秒计算
if(wt > 60)
wt = 60;
clientInfo[i].workTime = wt*60;
}
sort(clientInfo,clientInfo+n,cmp);//排队排序
for(int i=n-1;i>=0;--i)
{
if(clientInfo[i].time >= 3600*17+1)//排除不符合数据
--n;
else
break;
}
int sum = 0;int id = -1;
for(int i=8*3600;;++i)//时间模拟
{
int j;
for(j=0;j<k;++j)
{
//如窗口时间减 1,表示一秒过去了
if(window[j] > 0)
--window[j];
if(window[j] == 0 && clientInfo[id+1].time <= i)//窗口不忙 ,且有用户
{
if(id+1 < n)//如果用户不超过限额
{
window[j] = clientInfo[++id].workTime;
sum += abs(i - clientInfo[id].time);
}
else//否则所有的都已经完成
break;
}
}
if(j < k)
break;
}
printf("%.1f\n",sum/60.0/(1.0*n));
return 0;
}