松雅的自动门问题

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

当门是关闭的时候,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( a 是一个正整数)时刻进入,同时在 t1、t2、...、tm 时刻有 m 个客人进入。

   编程求出自动门打开的次数,假定开始时门是关闭的。

【输入形式】

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

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

【输出形式】

   输出门打开的次数
   代码如下:
      #include<iostream>
       using namespace std;
       int main()
{
	int n,m,a,d;
	cin>>n>>m>>a>>d;
	int k[m];
	for(int i=0;i<m;i++)
	{
		cin>>k[i];     //输入客人到达门的时间
	}                                                   //kt为第s个员工到达门时的时间,mt为第i个顾客到达门时的时间
	int c=0,s=1,i=0,t=0,kt,mt=k[0];    //定义门开次数c,通过门的员工数s,通过门的顾客书i,由于以数组记录,故i从0计数
	while(s<=n||i<m)                        //当员工或者顾客没有全部通过门时,条件成立。
	{
		t++;                            // 时间t,不断加1
		kt=a*s;                      // 第一次循环时s=1,kt为第一个员工到达门的时间
		if(kt==t)                   //  如果时间==kt,则门开
		{
			t=t+d;                       //  t+d的时间内门处于打开状态,人可以进入
			c++;                      //门打开,次数c+1;
			while(mt<=t)                   // 在门打开的时间内,看是否有顾客刚好经过
		{
			i++;                       //  条件成立,则 有一名顾客经过,i++
			mt=k[i];                     //将mt赋值为下一名顾客经过的时间
		}
		while(kt<=t)                    // 在门打开的时间内,看是否有员工刚好经过
		{
			s++;                       //条件成立,则 有一名顾客经过,s++
			kt=a*s;                //将kt赋值为下一名员工到达门的时间
		}
		}
		if(mt==t)                 //  如果时间==mt,则门开
		{
			t=t+d;                         //在t+d的时间内门处于打开状态
			c++;                          //门打开的次数加1
			while(mt<=t)           //重复上面的内容,看在门打开的时间内是否有员工或者客人经过
		{
			i++;
			mt=k[i];
		}
		while(kt<=t)
		{
			s++;
			kt=a*s;
		}
		}
	}                           //当所有客人和员工都经过门时,循环结束,输出门打开的次数c
	cout<<c;
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值