[2018.10.31 T2] 电梯

23 篇文章 0 订阅

暂无链接

电梯(lift)

题目背景

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

题面描述

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

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

输入数据

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

接下来每行五个数 N 、 M 、 a 、 b 、 c N、M、a、b、c NMabc

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

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

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

f [ i ] = ( f [ i − 1 ] × a + b )   m o d   ( N − 2 ) + 2 f[i]=(f[i-1]\times a+b)\ mod\ (N-2)+2 f[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 ≤ 10 N≤10 N10, M ≤ 10 M≤10 M10

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

对于 100%的数据

N ≤ 1 0 7 N≤10^7 N107, M ≤ 1 0 7 M≤10^7 M107, T ≤ 10 T≤10 T10 N ≥ M + 2 N≥M+2 NM+2 0 ≤ a 、 b 、 c ≤ 1000 0≤a、b、c≤1000 0abc1000 N ≥ 3 N≥3 N3 M ≥ 1 M≥1 M1

题解

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

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

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

代码
#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();}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ShadyPi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值