松雅旅馆自动门

本文介绍了一个通过编程模拟旅馆门开关次数的问题解决方案。采用一维数组记录时间线上员工和客人的进出情况,通过遍历时间线统计门的实际开关次数。

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

TITIL

#include <iostream>
//松雅旅店 
#include <cmath>
using namespace std;
int main(){
	int n=0,m=0,a=0,d=0,door=0; 

	cin>>n>>m>>a>>d;
		int arr[m];
	for(int i=0;i<m;i++){
		cin>>arr[i];         //输入客人进入的时间 
	}
	int time_max=0 ;
	time_max=max(arr[m-1],n*a);     //找出最大时间点 
	int line [time_max];
	for(int i =0;i<time_max;i++){
		line[i]=0;                 //把总时间线中的元素全搞为 0
	}
	for(int i =0;i<m;i++){
		line[arr[i]-1]=1;
	}                        //把有客人进入的时间线搞为1 
	for(int i=0;i<n;i++){
		line [(i+1)*a-1] =1;
	}
	for(int i =0;i<time_max;i++){
		if (line[i]==1){
			door++;
			i=i+d;          //根据数组赋值是否为1来判断是否有人 
		}
	}
	cout<<door;
	return 0;
}

思路简介
**本题难点在于怎么搞清楚客人和员工进来的区别,他们的交互会影响计时
其实你可以把时间拉成一条线 把客人和员工看成一个个因子,他们什么时候进入,就给这条线上打一个结,这样,就可以消除他们的相互影响
**

这样之后,就把人订住了,之后就考虑时间,因为题目是要输出们打开几次,所以你就先考虑第一次什么时候打开,也就是在这条时间线上第一次碰到1,然后就加上这个门开启的时间,中间无论有没有人进都不影响,等门关闭后又判断一次,以此类推,直到到达最大时间时结束 输出打开门次数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值