C语言实现 最大访客数(不同时间段) 查询程序

问题引入

                假如,现在将举办一场宴会,为了预先准备物品和安排相关事宜,让来参与宴会的客人事先填写到达时间与离开时间,如果要清楚至少安置多少个座位,必须先估计 不同时间的最大访客数 是多少。

问题分析

        对于上述问题看似有些复杂,其实并不难处理,就计算客人数这个目的,同时考虑同一客人的到达 时间与离开时间,会使程序变得复杂。因此,只要将来访时间与离开时间分开处理即可,假设客人 i 的到达时间为x[i],离开时间为y[i]。在客人到达时间和离开时间输入完毕之后,将x[i]与y[i]分别进行非递减排序(由小到大),只要先计算某时之前总共到达了多少客人,然后再减去某时之前离开的客人,就可解决这个问题。

代码实现

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define SWAP(x,y) {int t; t = x; x = y; y = t;}

int partition(int[], int, int);
void quicksort(int[], int, int); // 快速排序法
int maxguest(int[], int[], int, int);

int main(){
	int x[MAX] = {0};
	int y[MAX] = {0};
	int time = 0; 
	int count = 0;
	printf("\n**本次计算模拟采用24小时制,如下午3点则对应15(均为0-24小时 整点时间),输入-1 -1表示结束输入**\n\n"); 
	printf("\n范例:10 15\n");
	printf("\n输入到达时间和离开:"); 
	while(count < MAX){
		printf("\n>>");
		scanf("%d %d", &x[count], &y[count]); 
		if(x[count] < 0){
			break; 
		}
		count++;
	}
	
	if(count >= MAX){ 
		printf("\n超出最大访客数(%d)", MAX); 
		count--;
	}
	
	// 预先排序
	quicksort(x, 0, count);
	quicksort(y, 0, count);
	while(time < 25){
		printf("\n%d 时的最大访客数:%d",time, maxguest(x, y, count, time));
		time++;
	}
	printf("\n");
	return 0;
}

int maxguest(int x[], int y[], int count, int time){ 
	int i, num = 0;
	for(i = 0; i <= count; i++){ 
		if(time >= x[i]){
			num++;
		}
		if(time >= y[i]){
			num--;
		}
	}
	return num;
}
	
int partition(int number[], int left, int right){
	int i, j, s;
	s = number[right]; 
	i = left - 1;
	for(j = left; j < right; j++){ 
		if(number[j] <= s){
			i++;
			//借助宏命令实现元素交换,也可将元素交换语句写在此语句内部 
			SWAP(number[i], number[j]);
		}
	}
	//借助宏命令实现元素交换,也可将元素交换语句写在此语句内部 
	SWAP(number[i+1], number[right]); 
	return i+1;
}

void quicksort(int number[], int left, int right){ 
	int q;
	if(left < right){
		q = partition(number, left, right); 
		quicksort(number, left, q-1); 
		quicksort(number, q+1, right);
	}
}

运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等日出看彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值