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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值