PAT1017 和强迫症做斗争

改完了,以后开数组都开个最大的,不用int a[k]或是malloc,会出现段错误,原因不明。或者dev c++ 好像会出错

这题改了3天...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#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;
}

  

posted on   SijingLin  阅读(213)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示