[2018.10.31 T2] 電梯

暫無鏈接

電梯(lift)

題目背景

打完昆特牌後你不準備參加 NOIPNOIP 模擬賽了,因爲你有更重要的賽事— NOGPNOGP(National
Olympiad in Gwent in Provinces)你現在要上電梯去 NN 樓參加 NOGPNOGP。在你從 11 樓上電梯的同
時,你發現另有一臺空電梯從 11 樓同時向 NN 樓向上。

題面描述

NN 層樓中有 MM 層樓 (除了 11 層、NN 層) 被標記了,如果有電梯到達有標記的層數時會停下來 1s1s , 然後標記會消失。因爲標記消失了,所以下面一臺電梯到這一層時就不會再停了。而且如果你的電梯和旁邊電梯一起到達標記的層數的話,是你的電梯停下來,而旁邊電梯會繼續往上,然後標記消失。在電梯裏的你也可以按下一些內部的按鈕使自己的電梯在某層停下 1s1s (除了 11 層、NN層)。而旁邊的電梯不能讓自己停 1s1s

你覺得輸給一臺空電梯非常丟臉,現在求在你不慢於空電梯的情況下最快在什麼時候達到樓頂。若你不能不慢於空電梯,輸出 1-1。電梯上一層樓所需時間爲 1s1s注意在一層樓你只能停一次

輸入數據

第一行一個 TT 表示數據組數

接下來每行五個數 NMabcN、M、a、b、c

下面給出生成 MM 層被標記的層數的方法:

f[i]if[i] 表示第i個生成的被標記的層數

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

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

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%的數據,N10N≤10, M10M≤10

對於 60%的數據,N1000N≤1000, M1000M≤1000

對於 100%的數據

N107N≤10^7, M107M≤10^7, T10T≤10NM+2N≥M+20abc10000≤a、b、c≤1000N3N≥3M1M≥1

題解

仔細想想貪心策略,你會發現答案貌似是跟按按鈕的具體樓層無關的。

mm爲偶數的時候,我們不需要做任何操作,跟着空電梯一起向上,就能每個電梯接一半乘客從而一起到樓頂;當mm爲奇數時,我們需要在最後一個按按鈕的樓層之前停下,讓空電梯先上去接人,從而一起到樓頂。

注意,因爲第一層樓無法停下,所以二樓的乘客我們必須接,當只有二樓被按得時候我們無法與空電梯持平,所以輸出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();}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章