题干:
题目描述
Bella 姐姐又来回国发辣条啦。
所有集训队的小朋友按照训练成绩站成一排,从左到右为成绩从低到高排列。每个人都对和蔼的 Bella 姐姐有两个要求:
-
我至少需要 AiAi 根辣条。
-
我要比我左边的小朋友恰好多 BiBi 根辣条(比如左边小朋友是 33 根,Bi=5Bi=5,Ai=5Ai=5。 那么这个小朋友必须拿恰好 88 根辣条)。
当然啦,成绩最差的小朋友就没有权利说我要比别人多多少了,所以 B1=0B1=0(第一个小朋友没有第二种要求)。
Bella 姐姐问你,在保证能满足每个小朋友的要求的前提下,她至少要准备多少根辣条。可以证明一定有解。
输入
第一个数为数据组数 TT(T≤100T≤100)。
每组数据第一行一个整数 nn(1≤n≤1001≤n≤100)代表有 nn 个集训队小朋友。下标从 11 开始。
接下来一行有 nn 个整数 AiAi(0≤Ai≤1000≤Ai≤100)。
接下来一行有 nn 个整数 BiBi(0≤Bi≤1000≤Bi≤100,B1=0B1=0)。
输出
对于每组数据,输出一行,代表 Bella 姐姐最少准备的辣条根数。
输入样例
1
2
1 1
0 1
输出样例
3
解题报告:
贪心。还好这题告诉了你顺序,是线性排列的,否则需topu排序一下,比如这题然后可能还会用到二分。。(当然 也可以不用二分)
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
int a[MAX],b[MAX],c[MAX];
bool vis[MAX];
int main()
{
int t,n;
cin>>t;
while (t--) {
scanf("%d", &n);
for(int i = 1; i<=n; i++)
scanf("%d", &a[i]);
for(int i = 1; i<=n; i++)
scanf("%d", &b[i]);
int low = a[1], ans = a[1];
for(int i = 2; i<=n; i++) {
low += b[i];
c[i] = low - a[i];
ans += low;
}
int res = 0;
for(int i = 1; i<=n; i++) {
if(c[i] < res) res = c[i];
}
printf("%d\n", ans - n * res);
}
}