PAT A1017 Queueing at Bank

总结:

这道题考察了以下知识点:

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;
    }

猜你喜欢

转载自blog.csdn.net/luoshiyong123/article/details/81360646