题干:

题目描述

Bella 姐姐又来回国发辣条啦。

所有集训队的小朋友按照训练成绩站成一排,从左到右为成绩从低到高排列。每个人都对和蔼的 Bella 姐姐有两个要求:

  1. 我至少需要 AiAi 根辣条。

  2. 我要比我左边的小朋友恰好多 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);
	}
}