题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805491530579968
题意
银行M个窗口,N个人来办事,几点到,每个人需要的处理时间
问平均等待时间(17点后到不处理~)
Sample Input:
7 3
07:55:00 16
17:00:01 2
07:59:59 15
08:01:00 60
08:00:00 30
08:00:02 2
08:03:00 10
Sample Output:
8.2
思路
用一个数组windows[]模拟M个窗口的的当前时间(8点开始)
对N个记录按赶到时间排序,每个人选择当前时间最小的窗口进行办理
code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
struct node{
int arrive;
int p_time;
node(int a,int b):arrive(a),p_time(b){}
};
vector<node>R;
bool cmp(node x,node y) {return x.arrive<y.arrive;}
int main()
{
int N,M; cin>>N>>M;
while(N--)
{
int a,b,c,d; scanf("%d:%d:%d %d",&a,&b,&c,&d);
int temp=a*3600+b*60+c;
//迟到的人忽略
if(temp<=17*3600) R.push_back(node(temp,d*60));
}
sort(R.begin(),R.end(),cmp);
int wait=0;
//记录每个窗口的时间,初始都是8:00开始,啊啊啊啊啊啊啊啊啊
vector<int>windows(M+2,8*3600);//新写法
int i=0;
for(;i<R.size();++i)
{
int p,minn=inf;
for(int j=1;j<=M;++j)//选最先处理完的窗口
{
if(windows[j]<minn) {
minn=windows[j];
p=j;
}
}
if(R[i].arrive<windows[p]) {//需要等待
wait+=windows[p]-R[i].arrive;
windows[p]+=R[i].p_time;
}
else windows[p]=R[i].arrive+R[i].p_time;//不需要等待
}
printf("%.1f
",wait*1.0/60/R.size());
return 0;
}
总结
怎么说呢,挺简单的模拟,就是没想到用一个数组来模拟不同窗口的时间
最开始只想着不同窗口用一个时间来模拟。。。菜啊~