1017 Queueing at Bank (25 分)

注意事项:
题意要求“只有来晚了的人不能被服务”,但是如果等待导致超时是可以被服务的,这是最后一个测试点过不了的原因;
所有到的比较早的客人都需要等到8点钟
不用先将每个窗口填满,在查找最早结束窗口时候,可以以第1个窗口作为标的,这样可以节约代码行;
这道题可以不用队列,用数组来做;

思路:
结构体GUEST存储客人的到达时间和操作时间;WINDOW数组存放窗口的结束时间;
在录入数据的时候,处理到达时间,并清除掉不满足条件的数据之后按照到达时间排序;
遍历整个数组;
查找最先结束的那个窗口;
如果这个客人的到达时间过早,那么就调整到达时间以及修改等待时间;
如果到达时间比这个窗口的结束时间要早,说明要等待,否则就无需等待;
更新这个窗口的结束时间;

AC CODE:

#include <iostream>
#include <queue>
using namespace std;
const int maxn = 10010;
struct PERSON{
    int arr,pro;
};
int table[maxn];
struct rule{
    bool operator()(PERSON a,PERSON b){
        return a.arr>b.arr;
    }
};

priority_queue<PERSON,vector<PERSON>,rule> q;
int n,k,cnt_person=0;
double sum=0;

int findtable(){
    int id=0,time=0x3fffff;
    for(int i=0;i<k;i++){
        if(time > table[i]){
            time = table[i];
            id = i;
        }
    }
    return id;
}
int main() {
    fill(table,table+maxn,8*3600);
    cin >> n >> k;
    for(int i=0;i<n;i++){
        PERSON tmp;
        int h,m,s;
        scanf("%d:%d:%d %d",&h,&m,&s,&tmp.pro);
        tmp.arr = h*3600+m*60+s;
        q.push(tmp);
    }
    while(!q.empty()){
        PERSON tmp = q.top();
        q.pop();
        int table_index = findtable();
        if(tmp.arr>17*3600) break;
        if(tmp.arr<table[table_index]){//有等待就更新等待时间和桌子结束时间
            sum += table[table_index]-tmp.arr;
            table[table_index] += tmp.pro*60;
        }else table[table_index] = tmp.arr + tmp.pro*60 ;
        cnt_person++;
    }
    if(cnt_person==0) cout << "0.0";
    else printf("%.1f",sum/cnt_person/60);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值