题意
有n个恶龙,它们有ai的生命值,以及bi魔法值。一开始从下标1到下标n排列。
杀死一只生命值为x的恶龙,需要花费x秒。
杀死恶龙后,它会把他左右相邻的恶龙,生命值分别提高bi。
每当一只恶龙杀死,剩余的恶龙会紧凑排列。如一开始恶龙顺序为[1,2,3,4],杀死2后,剩余为[1,3,4],此时1和3相邻,3和4相邻。
可以选择杀恶龙的顺序。问,杀死这些恶龙,最少需要花费多少时间。
思路
由于一只恶龙杀死,会给相邻的恶龙贡献魔法值。
如果杀死一只中间的恶龙,那么对应的bi会贡献2次。而杀死一只边界的恶龙,对应的bi只会贡献1次。
因此,贪心策略,每次都杀死左边界或右边界的恶龙。
最后一只恶龙,它的bi没有贡献,那么我们把魔法值最大的恶龙,留到最后杀,即可。
代码很简单
水道题,朋友们周末愉快~
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pcc pair<char, char>
#define inf 0x3f3f3f3f
const int maxn = 1000010;
const int maxm = 210;
int n, x;
int a[maxn], b[maxn];
void solve() {
scanf("%d", &n);
ll res = 0;
int mx = -1;
for (int i = 0; i < n; ++i) {
scanf("%d", &x);
res += x;
}
for (int i = 0; i < n; ++i) {
scanf("%d", &x);
mx = max(mx, x);
res += x;
}
res -= mx;
printf("%lld\n", res);
}
int main() {
int t;
scanf("%d", &t);
// t = 1;
while (t--) {
solve();
}
}
/*
*/