CF1914C Quests

题目描述

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 ki 次每次做重复的任务。

可以证明其正确性。

代码

#include 
#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";
  }
}

你可能感兴趣的:(算法,数据结构)