题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1017
模拟排队
// WA: + 打成 +=
// 不好找呢,还是心不静呢?
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct People
{
int hour, minutes, second;
int total;
int need;
int wait;
};
vector<People> v;
int N, K;
void Input();
bool compare(People a, People b);
void Output();
bool compare(People a, People b)
{
return a.total<b.total;
}
void Input()
{
cin >> N >> K;
People p;
while(N-->0)
{
cin >> p.hour;
getchar();
cin >> p.minutes;
getchar();
cin >> p.second;
cin >> p.need;
p.total = p.hour*60*60 + p.minutes*60 + p.second;
v.push_back(p);
}
return ;
}
void Output()
{
vector<People>::iterator it;
int begintime[100];//每个窗口下次可用的时间,单位为s
for(int i=0; i<K; i++)
{
begintime[i]=8*60*60;
}
int sum=0, num=0;
for(it=v.begin(); it != v.end(); it++)
{
if((*it).hour < 17 || ( (*it).hour==17 && (*it).minutes ==0 && (*it).second == 0 ))
{
num++;
}
else
{
break;
}
sort(begintime, begintime+K);
int *p = begintime;//选取最小的时间
if(*p > (*it).total)
{
(*it).wait = *p-(*it).total;
sum += (*it).wait;
*p += (*it).need*60;
}
else
{
(*it).wait = 0;
sum += (*it).wait;
*p = (*it).total+(*it).need*60;
}
}
printf("%.1lf\n", (sum/60.0)/num);
}
void show()
{
int i;
for(i=0; i<v.size(); i++)
{
printf("%7d %02d:%02d:%02d %d\n", v[i].total, v[i].hour, v[i].minutes, v[i].second, v[i].need*60);
}
return ;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("E:\\in.txt", "r", stdin);
// freopen("E:\\out.txt", "w", stdout);
#endif
Input();
sort(v.begin(), v.end(), compare);
Output();
return 0;
}