[2018.10.31 T2] 电梯

本文探讨了一个有趣的电梯竞赛问题,涉及两部电梯的竞争策略,一部载人电梯如何在不落后于空电梯的前提下,尽快到达目标楼层。通过对贪心策略的深入分析,文章揭示了在特定条件下电梯停止的最佳时机,以及如何通过算法计算最优到达时间。

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

暂无链接

电梯(lift)

题目背景

打完昆特牌后你不准备参加 NOIPNOIPNOIP 模拟赛了,因为你有更重要的赛事— NOGPNOGPNOGP(National
Olympiad in Gwent in Provinces)你现在要上电梯去 NNN 楼参加 NOGPNOGPNOGP。在你从 111 楼上电梯的同
时,你发现另有一台空电梯从 111 楼同时向 NNN 楼向上。

题面描述

NNN 层楼中有 MMM 层楼 (除了 111 层、NNN 层) 被标记了,如果有电梯到达有标记的层数时会停下来 1s1s1s , 然后标记会消失。因为标记消失了,所以下面一台电梯到这一层时就不会再停了。而且如果你的电梯和旁边电梯一起到达标记的层数的话,是你的电梯停下来,而旁边电梯会继续往上,然后标记消失。在电梯里的你也可以按下一些内部的按钮使自己的电梯在某层停下 1s1s1s (除了 111 层、NNN层)。而旁边的电梯不能让自己停 1s1s1s

你觉得输给一台空电梯非常丢脸,现在求在你不慢于空电梯的情况下最快在什么时候达到楼顶。若你不能不慢于空电梯,输出 −1-11。电梯上一层楼所需时间为 1s1s1s注意在一层楼你只能停一次

输入数据

第一行一个 TTT 表示数据组数

接下来每行五个数 N、M、a、b、cN、M、a、b、cNMabc

下面给出生成 MMM 层被标记的层数的方法:

f[i]表示第i个生成的被标记的层数f[i] 表示第i个生成的被标记的层数f[i]i

f[1]=c mod (N−2)+2f[1]=c\ mod\ (N-2)+2f[1]=c mod (N2)+2

f[i]=(f[i−1]×a+b) mod (N−2)+2f[i]=(f[i-1]\times a+b)\ mod\ (N-2)+2f[i]=(f[i1]×a+b) mod (N2)+2

若生成的f[i]已经被标记了,则f[i]=现在最低的没有被标记的那一层(第1层除外)若生成的 f[i] 已经被标记了,则f[i]=现在最低的没有被标记的那一层(第1层除外)f[i]f[i]=1

输出数据

对每行数据输出一行答案。

样例数据
INPUT

3
5 3 1 8 2
4 2 6 1 1
7 2 3 1 3

OUTPUT

6
4
7

样例解释

第一份数据:(下文 表示你的电梯, 表示空电梯)
一共五层楼,中间三层都被按了按扭
1s 上 2
2s 停, 上 3
3s 上 3, 停 3
4s 主动停 3, 上 4
5s 上 4, 停 4
6s 上 5, 上 5

数据范围

对于 20%的数据,N≤10N≤10N10, M≤10M≤10M10

对于 60%的数据,N≤1000N≤1000N1000, M≤1000M≤1000M1000

对于 100%的数据

N≤107N≤10^7N107, M≤107M≤10^7M107, T≤10T≤10T10N≥M+2N≥M+2NM+20≤a、b、c≤10000≤a、b、c≤10000abc1000N≥3N≥3N3M≥1M≥1M1

题解

仔细想想贪心策略,你会发现答案貌似是跟按按钮的具体楼层无关的。

mmm为偶数的时候,我们不需要做任何操作,跟着空电梯一起向上,就能每个电梯接一半乘客从而一起到楼顶;当mmm为奇数时,我们需要在最后一个按按钮的楼层之前停下,让空电梯先上去接人,从而一起到楼顶。

注意,因为第一层楼无法停下,所以二楼的乘客我们必须接,当只有二楼被按得时候我们无法与空电梯持平,所以输出−1-11

代码
#include<bits/stdc++.h>
using namespace std;
int n,m,c,T;
void in(){scanf("%d%d%*d%*d%d",&n,&m,&c);}
void ac()
{
	if(c%(n-2)==0&&m==1)puts("-1");
	else if(m&1)printf("%d\n",n+(m>>1));
	else printf("%d\n",n+(m>>1)-1);
}
int main(){for(scanf("%d",&T);T--;)in(),ac();}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ShadyPi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值