zoukankan      html  css  js  c++  java
  • PAT1017 和强迫症做斗争

    改完了,以后开数组都开个最大的,不用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;
    }
    

      

  • 相关阅读:
    深(爆)搜专题整理
    牛客CSP-S提高组赛前集训营1 T2:乃爱与城市拥挤程度
    [BZOJ3743][Coci2015]Kamp 题解
    CSP2019-S,J初赛游记
    指针复习
    二叉树复习
    最短路复习
    数据库关联查询与模型之间的关联
    数据库操作Flask-SQLAlchemy之模型声明及数据库表的生成与删除
    csrf攻击防范
  • 原文地址:https://www.cnblogs.com/lsj2020/p/5833999.html
Copyright © 2011-2022 走看看