#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;
}
浙大pat 1017
最新推荐文章于 2022-08-11 23:27:37 发布