松雅旅馆的自动门

本文介绍了一种算法,用于计算特定条件下自动门的开关次数,包括员工和顾客进入的时间点,考虑门的开关机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】

        松雅的旅馆门口有一个自动门,按照以下方式工作:

    • 当门是关闭的时候,1或多个人来到门前,门将马上自动打开,所有人都能马上入内;

    • 当门是打开的时候,1或多个人来到门前,所有人都能马上入内;

    • 打开的门在打开后的 d 秒钟内立即关闭;

    • 当门正在关闭时,1或多个人在同一时刻来到门前,所有人有足够时间入内,之后才会关闭 

       例如,如果 d=3,有4人在4个不同时刻t1=4、t2=7、t3=9 和 t4=13 来到门前,门将会打开3次,即在时刻4、9和13打开,在时刻7和12关闭。

       已知有 n 个员工将在 a、2*a、3*a、...、n*a( 是一个正整数)时刻进入,同时在 t1、t2、...、tm 时刻有 m 个客人进入。

       编程求出自动门打开的次数,假定开始时门是关闭的。
【输入形式】

       第一行4个正整数 n、m、a、d,分别表示员工数、客人数、第一个雇员进入的时刻、门打开后到关闭的时间长度。

       第二行包括一个正整数序列 t1、t2、...、tm,表示 m 个客人来到门前的时刻,这是一个非递减序列。
【输出形式】

       输出门打开的次数
【样例输入】

1 1 3 4
7

【样例输出】

1

代码如下:

#include<iostream>
using namespace std;
void bubbleSort(int *arr,int len)
{
for(int i=0;i<len-1;i++)
	{
		for(int j=0;j<len-i-1;j++)
		{
			if(arr[j]>arr[j+1])
			{
				int temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
			}
		}
	}
}
int main()
{
	int n,m,a,d;
	cin>>n>>m>>a>>d;//员工数、客人数、第一个雇员进入的时刻、门打开后到关闭的时间长度。
	int t[m];
	for(int i=0;i<m;i++)
	{
		cin>>t[i];//客人进入的时刻 
	}
	int e[n];//e(employee)
	for(int i=0;i<n;i++)
	{
		e[i]=(i+1)*a;//雇员进入的时刻 
	}
	int arr[n+m];
	for(int i=0;i<m;i++)
	{
		arr[i]=t[i];
	}
	for(int i=m;i<m+n;i++)
	{
		arr[i]=e[i-m];
	}
	int len=m+n;
	bubbleSort(arr,len);//对arr[]进行从小到大的冒泡排序 
	int sum=0;
	for(int i=0;i<m+n-1;i++)
	{
		if(arr[i]==arr[i+1])
		{
			sum++;
			arr[i]=0;
		}
	} 
	int arr2[m+n-sum];
	int temp=0;
	for(int i=0;i<m+n;i++)
	{
		if(arr[i]!=0)
		{
			arr2[i-temp]=arr[i];
		}
		else
		{
			temp++;
		}
	}//截至此步已经完成了对于所有客人(删除重复客人)的递增排序,即arr2[m+n-sum] 
	int total=m+n-sum;//简单一点啦 
	int f=0,time=0;//f为frequency,次数 ;time为标准时间 
	for(int i=0;i<total;i++)
	{
		if(i==0)
		{
			f++;
			time=arr2[i]+d;
			continue;
		}
		if(arr2[i]>time)
		{
			time=arr2[i];
			f++;
			time+=d;
		}
	}
	cout<<f<<endl;
	system("pause");
	return 0;
}

虽然这题做的时间比较长,但是想了很多思路,好在这题不需要for嵌套循环,一步一步去想去分析还是挺容易走到最后的(前提是你前面别粗心错了)

这题差不多就考察两个点,一个是多组数据的整理排序,一个是理解题目,按题目要求输出

还有一个注意点,就是题目中的那个时刻7,正好是4+3,(当然那个客人肯定不会夹死在电梯门那里的哈)题目中没有明说7到底算第一次开门时进去的,还是需要第7秒给他单独开一次门,但是数据中显示第二次开门是在9,由此可以判断第二个客人是在第一次开门时进去的

数组这部分还有不少题也是在两个时刻间纠缠,关键就在于等号加不加。题目条件含糊不清时就去看看样例,样例也没涉及到时不妨把cg上测试点骗出来看看。万一测试点也没有涉及这个。。。那不就更是随便了嘛,怎么编都对

感觉思路还是蛮清晰的吧,emmm,不知道大家能不能看懂

PS:白嫖怪拿走时别忘了改一下变量名称;以后不想每题都发了,找点有价值的题加上注释发出来感觉更有意义一点

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一二爱上蜜桃猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值