浙大pat 1017

#include<iostream>
#include<queue>
#include<string>
#include<vector>
#include<algorithm> 
using namespace std;
//说明:这道题目只要是17:00之前到的都会被处理,通俗点就是银行17:00之后不让进了
int N,K;

struct Task{
    int arrive_time;
    int serve_time;
    int start_serve_time;
    int complete_time;
    //按照完成时间从小到大排序 
    friend bool operator<(Task t1,Task t2)
    {
        return t1.complete_time>t2.complete_time;       
    }
};
int cmp(Task t1,Task t2){
    return t1.arrive_time<t2.arrive_time;
}
Task task[10005]; 

priority_queue<Task> q;
//获取多少秒 
int get_time(string str){
    int a=(str[0]-'0')*10+(str[1]-'0');
    int b=(str[3]-'0')*10+(str[4]-'0');
    int c=(str[6]-'0')*10+(str[7]-'0');
    return a*3600+b*60+c;
}

int main(){
    scanf("%d%d",&N,&K);
    string a;
    int b;
    for(int i=1;i<=N;i++){
        cin>>a>>b;
        task[i].arrive_time=get_time(a);
        task[i].serve_time=b*60;
    }
    sort(task+1,task+N+1,cmp);

    int n=N;//忘记初始化了,导致WA,因为可能所有的任务都大于17*3600这样就会导致n没有初值 
    for(int i=1;i<=N;i++)
        if(task[i].arrive_time>17*3600){
            n=i-1;
            break;
        }
    double sum=0;
    if(n<=K){
        for(int i=1;i<=n;i++){
            if(task[i].arrive_time<8*3600){ 
                task[i].start_serve_time=8*3600;
                sum+=(task[i].start_serve_time-task[i].arrive_time);
            } 
        }
        if(n==0)
            printf("0.0\n");
        else
            printf("%.1f\n",sum*1.0/(60.0*n));
    }else{
          for(int i=1;i<=K;i++){
              if(task[i].arrive_time<8*3600)
                task[i].start_serve_time=8*3600;
              else
                task[i].start_serve_time=task[i].arrive_time;
              task[i].complete_time=task[i].start_serve_time+task[i].serve_time;
              sum+=(task[i].start_serve_time-task[i].arrive_time);
              q.push(task[i]);
          }
          for(int i=K+1;i<=n;i++){
              Task tmp=q.top();q.pop();
              if(task[i].arrive_time<=tmp.complete_time)
                  task[i].start_serve_time=tmp.complete_time;
              else
                  task[i].start_serve_time=task[i].arrive_time;
              task[i].complete_time=task[i].start_serve_time+task[i].serve_time;
              sum+=(task[i].start_serve_time-task[i].arrive_time);
              q.push(task[i]);
          }
          printf("%.1f\n",sum*1.0/(60.0*n));
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值