改完了,以后开数组都开个最大的,不用int a[k]或是malloc,会出现段错误,原因不明。或者dev c++ 好像会出错
这题改了3天...
#include<stdio.h>
//#include<iostream>
#include<stdlib.h>//malloc?
#include<iomanip>//setprecision(1) 保留一位小数
#define ERROR 0
#define MAX 10000
//using namespace std;
//定义元素类型customer
struct customer{
int time_arrive;//以秒计 同下
int time_done;//
int time_processing;//
int time_remain;//余下时间,开始=processing
};
int cmp ( const void *a , const void *b )
{
return (*(struct customer *)a).time_arrive >(*(struct customer *)b).time_arrive?1:-1;
}
bool winava(struct customer* win[],int k){
for(int i=0;i<k;i++){
if(win[i]==NULL)
return true;
}
return false;
}
int MyMin(struct customer* win[],int k){//当窗口都没有人时返回最大值
int min=60*61;
while(k--){
if(win[k]!=NULL&&min>win[k]->time_remain)
min=win[k]->time_remain;
}
return min;
}
bool clear(struct customer* win[],int k){
for(int i=0;i<k;i++)
if(win[i]!=NULL)
return 0;
return 1;
}
int main(){
double ave;
int n,k,axis=28800,h,m,s,process,order=0;//n:cus,k:windows order记录以处理的客户 0开始
scanf("%d%d",&n,&k);
struct customer cus[100010];
for(int i=0;i<n;i++){
scanf("%d:%d:%d",&h,&m,&s);
scanf("%d",&process);
if(60*60*h+m*60+s>61200){//晚于17点
n--;
i--;
continue;
}
cus[i].time_arrive=60*60*h+m*60+s;//以秒计时
cus[i].time_remain=cus[i].time_processing=process*60;
cus[i].time_done=0;
}
qsort(cus,n,sizeof(struct customer),cmp);//按到达时间排序
struct customer* win[10000];
for(int i=0;i<k;i++)
win[i]=NULL;
while(!(order==n&&clear(win,k))){//order==n时表示队列空
int min=MyMin(win,k);
if(order!=n&&(cus[order].time_arrive-axis<min)&&winava(win,k)){//队首到达-axis<min(窗口)&&窗口有空 order==n时表示队列空 出队
if(axis<cus[order].time_arrive){//
for(int i=0;i<k;i++){
if(win[i])
win[i]->time_remain-=(cus[order].time_arrive-axis);
}
axis=cus[order].time_arrive;
}
for(int i=0;i<k;i++){
if(win[i]==NULL){
win[i]=&cus[order];
break;
}
}
order++;
}
else{//处理一个
axis+=min;
for(int i=0;i<k;i++){
if(win[i]!=NULL&&min==win[i]->time_remain){
win[i]->time_done=axis;
//cout<<win[i]->time_done/60/60<<":"<<win[i]->time_done/60%60<<endl;
win[i]=NULL;
}
else if(win[i]!=NULL){
win[i]->time_remain-=min;
}
}
}
}
int sum=0;
for(int i=0;i<n;i++){
sum+=cus[i].time_done-cus[i].time_arrive-cus[i].time_processing;
}
ave=1.0*sum/60/n;
printf("%0.1f",ave);//
return 0;
}