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; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步