(今天心情不太好 , 划水摸鱼一下)
题目链接:U392419 『ZOI Round #1』等地铁 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
算法 : 前缀和
这题是前缀和板子题 再加上一点点的数学
我们需要知道地铁出发到达小Z所需站台的时间
由于题目给出的是相邻两个站台的时间
我们可以直接使用前缀和来计算地铁出发到每个站台所需时间
除此之外
我们还需要知道是第几班地铁(因为小Z可能会错过上一班 , 就必须等下一班)
按照整个时间轴来看 我们第一班地铁从0时刻到每个站台的时间已经通过前缀和处理出来了
第二班地铁到每个站台的时间 就是第一班地铁的基础上再加上发车间隔时间k
同理 第n班就是 就是第一班地铁的基础上再加上发车间隔时间 (n-1) * k
我们只需要保证 (n-1) * k + 地铁开往站台的时间 >= 小Z到达站台时间就行
代码如下:
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N = 1e5 + 10;
const int inf = 2147483647;
int xu[N];
void solve()
{
int n , k , q , num;
cin >> n >> k >> q;
for (int i = 2 ; i <= n ; i++)
{
cin >> num;
xu[i] = xu[i-1] + num;
}
while(q--)
{
int a , t;
cin >> a >>t;
if (t <= xu[a])
{
cout << xu[a] - t << endl;
}
else
{
int n = (t - xu[a] + k - 1) / k;
cout << n * k + xu[a] - t << endl;
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
solve();
return 0;
}
题目难度不大 但是是一道很好的板子题
(今天心情不好 , 状态不对 , 思维很乱 , 请大家谅解)