坐电梯【牛客tracker 每日一题】

发布时间:2026/10/28 1:59:33
坐电梯【牛客tracker  每日一题】

坐电梯

时间限制:1 秒
空间限制:32M

网页链接

牛客tracker

牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!


题目描述

小 sun 非常懒,所以他非常喜欢坐电梯,但是他发现了一个问题:当他在k kk楼想要坐电梯去1 11楼时,如果比他高的楼层有人想坐电梯去1 11楼,他就必须等待,直到电梯把他楼上的人接完了,才能到他的楼层来接他,于是他是非常的苦恼。现在他想问问你,如果他知道某个时刻所有想坐电梯的人所在的楼层,他要等多久电梯才能到他的楼层。

关于电梯:

电梯最开始在1 11楼,每一秒可以上升,或者下降一个楼层。

在同一时刻有多个请求时,电梯会优先处理最高楼层的请求。


输入描述

第一行,两个整数:n , k n, kn,k,代表在当前时刻总共有n nn个去1 11楼的请求,小 sun 在第k kk楼,数据保证k kk不为1 11

第二行,共n nn个整数a i a_iai​,每个整数代表一个请求所在的层数。


输出描述

输出一行,他要等待的时间(秒)


示例 1

输入:

5 3 1 2 3 5 5

输出:

6

数据范围

解题思路

本题是贪心 + 分类讨论的简单模拟问题。电梯初始在 1 楼,所有请求都是前往 1 楼,且同一时刻有多个请求时电梯优先处理最高楼层的请求。小 sun 在k kk楼,需要计算电梯到达k kk楼接他所需要等待的时间。

1. 问题等价转化

电梯的移动规则如下:

设所有请求中的最高楼层为m x mxmx(不包括小 sun 所在的k kk楼,但若k kk更高,则k kk本身也是请求)。

2. 分类讨论
3. 算法实现
  1. 读入n , k n, kn,k。
  2. 遍历所有请求楼层a i a_iai​,求出最大值m x mxmx。
  3. 根据上述分类计算答案:
    • 若m x ≤ k mx \le kmx≤k,输出k − 1 k - 1k−1;
    • 否则输出2 m x − k − 1 2mx - k - 12mx−k−1。
4. 复杂度分析

总结

通过分析电梯“优先处理最高楼层”的规则,将等待时间分为两种情况:最高请求不高于k kk时,电梯直接到达k kk楼;最高请求高于k kk时,电梯先上升至最高楼层再下降至k kk楼。分类计算即可得到答案,方法简单高效。

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll n,k;cin>>n>>k;ll mx=0,v;for(ll i=0;i<n;i++){cin>>v;if(v>mx)mx=v;}if(mx<=k)mx=k-1;elsemx=mx-1+mx-k;cout<<mx<<'\n';return0;}