【PAT甲级】1017 Queueing at Bank (25 分)

题意:

输入两个正整数N,K(N<=10000,k<=100)分别表示用户的数量以及银行柜台的数量,接下来N行输入一个字符串(格式为HH:MM:SS)和一个正整数,分别表示一位用户到达银行的时间以及该用户占用银行资源的时间,求用户的平均等待时间。(当一位用户早于早晨八点到达银行不开门,他需要等待,当一位用户晚于下午五点到达银行关门,该用户不计入等待时间计算)【答案保留一位小数】

AAAAAccepted code:

#include<bits/stdc++.h>
using namespace std;
string s;
typedef struct{
    int t,x;
}stct;
stct user[10007];
bool cmp(stct a,stct b){
    if(a.x!=b.x)
        return a.x<b.x;
    return a.t<b.t;
}
int line[107];
int main(){
    double sum=0;
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;++i){
        cin>>s>>user[i].t;
        int x=0;
        x+=(s[0]-'0')*36000;
        x+=(s[1]-'0')*3600;
        x+=(s[3]-'0')*600;
        x+=(s[4]-'0')*60;
        x+=(s[6]-'0')*10;
        x+=s[7]-'0';
        user[i].x=x;
        user[i].t*=60;
        if(user[i].x<8*3600){
            sum+=8*3600-user[i].x;
            user[i].x=8*3600;
        }
    }
    sort(user+1,user+1+n,cmp);
    int cur=99999999;
    int num=0;
    for(int i=1;i<=k;++i){
        if(i>n)
            break;
        num=i;
        line[i]=user[i].x+user[i].t;
        cur=min(cur,line[i]);
    }
    for(int i=k+1;i<=n;++i){
        if(user[i].x>17*3600)
            break;
        num=i;
        sum+=max(0,cur-user[i].x);
        for(int j=1;j<=k;++j)
            if(line[j]==cur){
                if(cur<user[i].x)
                    line[j]=user[i].x+user[i].t;
                else
                    line[j]+=user[i].t;
                break;
            }
        cur=99999999;
        for(int j=1;j<=k;++j)
            cur=min(cur,line[j]);
    }
    sum/=num;
    sum/=60;
    printf("%.1f",sum);
    return 0;
}

 

 

 

posted @ 2019-08-11 17:07  sewage  阅读(117)  评论(0编辑  收藏  举报