- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
描述
亚历克斯计划参观博物馆,并在柜台购买相同的通行证。管理员决定不出售团体通行证,一次只提供一张通行证。如果访客需要一张以上的通行证,他/她必须再次重新排队到柜台并购买下一张通行证。亚历克斯想购买许多通行证。访客顺序和每位访客需要的通行证数量是已知的,亚历克斯需要多少时间才能买到所有的通行证?Alex在队列中的位置将被给定,每次交易需要1个时间单位。可以忽略每次转到行后面所需的时间。
arr|<=100000
arr[i]<=10000
样例
样例 1:
输入:
arr=[1,2,5],k=1
输出:
4
解释:
有3个人 0,1,2 在排队。亚历克斯的编号是1
第一个时间点,队列为0(1)<-1(2)<-2(5),编号0获得门票。
第二个时间点,队列为1(2)<-2(5) 亚克斯获得门票,并返回队伍最末端
第三个时间点,队列为2(5)<-1(1) 编号2获得门票,并返回队伍最末端
第四个时间点,队列为1(1)<-2(4) 亚克斯获得门票,他已经买到了所需要的所有门票
样例 2:
输入:
arr=[3,2,1], k = 0,
输出:
6
题解
前面的人是 min(A[i], A[k]) 自己是A[k] 后面的人是 min(A[i], A[k]-1)
export class Solution {
/**
* buyPasses
*
* @param arr: the line
* @param k: Alex place
* @return: the time when Alex requires to buy all passes
*/
buyPasses(arr, k) {
// Write your code here.
let ans = 0;
for (let i = 0; i < arr.length; i++) {
if (i <= k) ans += Math.min(arr[k], arr[i]);
else ans += Math.min(arr[k] - 1, arr[i]);
}
return ans;
}
}