PAT1017 和强迫症做斗争

本文介绍了一个银行排队系统的模拟程序,使用C语言实现。该程序通过输入客户的到达时间和所需办理业务的时间,模拟多个服务窗口的工作流程,并计算平均等待时间。

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

  

转载于:https://www.cnblogs.com/lsj2020/p/5833999.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值