1539.糖果共享(share)
题目描述
Jimmy 要和其他同学们一起分享老师带来的糖果了!可是,老师不想让同学们这么快就领到糖果,于是决定跟大家玩一个分享糖果的游戏。
老师让 n 个同学们围成一圈坐在一起。接下来,对于第 i 个同学,老师会在第 ti 秒发给 TA 一份糖果;每次得到糖果之后,第 i 个同学会固定等待 pi秒,然后把糖果分给身旁的第 i+1 个同学(特殊的情况是,第 n 个同学会把糖果分给第 1 个同学)。注意每个同学既可以从老师那里得到糖果,也可以从旁边的同学那里得到糖果,而且老师发的糖果足够多,同学们只要收到了糖果,就一定能将糖果分出去。同学们的分糖果动作非常快,可以认为是不占用时间的。
在参与游戏的同时,Jimmy 很想知道他的几个好朋友们最快什么时候能得到糖果。你能帮帮他吗?
输入 第一行一个整数 n,表示同学们的数量。
第二行 n 个整数 t1,t2,⋯,tn,表示每个同学收到老师给的糖果的时刻。
第三行 n 个整数 p1,p2,⋯,pn,表示每个同学收到糖果之后、将糖果分出去之前等待的时间。第四行一个整数 q,表示 Jimmy 的询问数量。
接下来 q 行,每行一个整数 xi,表示 Jimmy 想问第 xi个同学最快什么时候能得到糖果。
输出 输出共 q 行,每行一个整数,表示每个询问对应的答案。
样例数据
输入 #1 复制
3
3 10 100
4 1 5
2
2
3
输出 #1 复制
7
8
数据范围限制
对于 30% 的数据,保证 1≤n,q≤5000。
对于100%的数据,保证1≤n,q≤2∗105≤ti,pi≤109,1≤xi≤n。
#include <bits/stdc++.h>
using namespace std;
int n, q, t[5007], p[5007], x[5007], m[5007];
int main()
{
scanf ("%d", &n);
for (int i = 1; i <= n; i++)
scanf ("%d", &t[i]);
for (int i = 1; i <= n; i++)
scanf ("%d", &p[i]);
scanf ("%d", &q);
for (int i = 1; i <= q; i++)
scanf ("%d", &x[i]);
for (int i = 1; i <= n; i++)
m[i + 1] = min (t[i + 1], t[i] + p[i]);
for (int i = 1; i <= n; i++)
m[i + 1] = min (t[i + 1], t[i] + p[i]);
for (int i = 1; i <= q; i++)
printf ("%d\n", m[x[i]]);
return 0;
}