A 曹老师的金句
题目链接:https://ac.nowcoder.com/acm/contest/94570/A
现在有同学需要这些金句,于是曹老师找孙老师和廖老师帮忙分发,但他们同时只有一个人参与分发。
现在有同学前来排队领取,其中第 0 个人站在队伍 最前方,第 n-1 人站在队伍 最后方。
给定一个从 0 开始的整数数组 tickets,其长度为 n,其中第 i 个人想要领取的数量为 tickets[i]。
每个人领取需要花费 1 秒。每个人一次只能领取 一份,如果需要领取更多的,他必须走到 队尾 重新排队(瞬间发生,不计时间)。如果一个人没有剩下需要领取的,那么他将会从队伍中消失。
请计算位于位置 k 的人完成领取所需的时间(以秒为单位)。
解析:
题中要求第k个同学取完票的时间,根据题意,我们可以得到:
第 i 次取到第 k 个同学取票时,该同学前面的同学都取了 i 次票,该同学后面的同学都取了 i-1 次票。因此,我们可以直接计算出第 k 个同学最后一次取票时的时间。
因此我们可以得到
for(int i = 0;i<n;i++)
{
if(i<=k)
time+=tickets[k];
else
time+=tickets[k] - 1;
}
在题目中,我们会发现,有部分同学取完票之后不会再进行排队,因此,我们要判断那一部分同学拿了多少票,因此,代码更新为
for(int i = 0;i<n;i++)
{
if(i<=k)
if(tickets[i] <= tickets[k]) time+=tickets[i];
else time+=tickets[k];
else
if(tickets[i] < tickets[k]) time+=tickets[i];
else time += tickets[k]-1;
}
特别需要注意的是:
题目中的数据范围为,其中 n * tickets = 1e10,超过了int的范围,因此,应该用long long
n == tickets.length
1 <= n <= 10000
1 <= tickets[i] <= 1e6
0 <= k < n
代码:
#include <iostream>
using namespace std;
const int N = 1e4+10;
int q[N],res[N];
int main(){
int n;
cin>>n;
for(int i = 0;i<n;i++)
{
cin>>q[i];
}
long long time = 0;
int k;
cin>>k;
for(int i = 0;i<n;i++)
{
if(i<=k)
if(q[i] <= q[k]) time+=q[i];
else time+=q[k];
else
if(q[i] < q[k]) time+=q[i];
else time += q[k]-1;
}
cout<<time;
return 0;
}