有 n n n 个任务,在完成 i i i 任务时, i i i 之前的所有任务都必须完成。同时,可以多次完成某个任务。总共可以做 k k k 次任务,第一次完成 i i i 任务的贡献为 a i a_i ai? ,后面完成 i i i 任务的贡献为 b i b_i bi? ,求最大贡献。
很容易得出,如果要重复做,那么肯定一直做能做的中最大的,所以我们可以枚举第一次做任务,和重复做任务的分界点,前 i i i 次每次做新任务,后 k ? i k-i k?i 次每次做重复的任务。
可以证明其正确性。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2 * 1e5 + 5;
int T, n, k;
struct node{
int a, b;
}arr[N];
signed main(){
for(cin >> T; T; T --){
cin >> n >> k;
for(int i = 1; i <= n; i ++){
cin >> arr[i].a;
}
for(int i = 1; i <= n; i ++){
cin >> arr[i].b;
}
int maxn = -1e9, ans = 0, sum = 0;
for(int i = 1; i <= min(n, k); i ++){
maxn = max(maxn, arr[i].b);
sum += arr[i].a;
ans = max(ans, sum + (k - i) * maxn);
}
cout << ans << "\n";
}
}