总结:
这道题考察了以下知识点:
1.priority_queue 从小到大排序
2.认真读题,正确处理数据,如把数据换成秒来精确计算
代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<functional>
using namespace std;
struct node{
int hour;
int min;
int sec;
int last;
int flag;
};
vector<node> s;
bool cmp(const node&a, const node&b)
{
if (a.hour != b.hour)return a.hour < b.hour;
else{
if (a.min != b.min)return a.min < b.min;
else
{
if(a.sec!=b.sec)return a.sec < b.sec;
else return a.flag < b.flag;
}
}
}
int a[110];
int main()
{
priority_queue<double, vector<double>, greater<double> > h;
int m, n;
cin >> m >> n;
for (int i = 0; i < n; i++)h.push(0);
double sum = 0.00;
for (int i = 0; i < m; i++)
{
node sp;
scanf("%d:%d:%d %d", &sp.hour, &sp.min, &sp.sec, &sp.last);
if (sp.last>60)sp.last=60;
if (sp.hour < 8){
sp.flag = sp.hour * 60 + sp.min;
sum += 1.0*(7 - sp.hour) * 60.0*60.0 + 60.0*(60 - sp.min-1)+(60-sp.sec); sp.hour = 8; sp.min = 0; sp.sec = 0;
}
if(3600.0*sp.hour+60.0*sp.min+sp.sec<=61200)s.push_back(sp);
}
sort(s.begin(), s.end(), cmp);
//for (auto it = s.begin(); it != s.end(); it++)
//printf("%d:%d:%d %d\n",it->hour,it->min,it->sec,it->last);
//cout <<"sum等于:"<< sum << endl;
auto tt = s.end(); tt--;
for (auto it = s.begin(); it != s.end(); it++)
{
//cout << "当前队头元素为:" <<h.top()<< endl;
double gg =(it->hour * 60.0*60.0) + 60.0*it->min + it->sec;
//cout << "顾客到达时间:" << gg << endl;
if (h.top() <= gg)
{
h.pop(); h.push(gg+60.0*it->last);
//cout << "无需等待!" << endl;
}
else
{
double tu = h.top();
sum += (tu - gg);
//cout << "等待时间为:" << tu - gg << endl;
h.pop(); h.push(tu+60.0*it->last);
}
//cout << "累计等待时间为:" << sum << endl;
}
double result = sum / (60.0*s.size());
printf("%.1f",result);
return 0;
}