题解:AT_abc396_c [ABC396C] Buy Balls

· · 题解

题面

题目描述

N 黑球和 M 白球。

每个球都有一个值。第 i 个黑球( 1 \le i \le N )的值为 B_i,第 j 个白球( 1 \le j \le M )的值为 W_j

选择 0 个或多个球,使选中的黑球的数量至少等于选中的白球的数量。在所有这些选择中,找出所选球值的最大可能和。

数据范围

解题思路

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    int n,m;
    cin>>n>>m;
    vector<ll> b(n,0),w(m,0);
    for(int i=0;i<n;i++){
        cin>>b[i];
    }
    for(int j=0;j<m;j++){
        cin>>w[j];
    }
    sort(b.begin(),b.end(),greater<ll>());//黑球按值降序排列
    sort(w.begin(),w.end(),greater<ll>());//白球按值降序排列
    vector<ll> bs(n+5,0);
    for(int i=1;i<=n;i++){
        bs[i]=bs[i-1]+b[i-1];//计算黑球的前缀和数组
    }
    vector<ll> ws(m+5,0);
    for(int j=1;j<=m;j++){
        ws[j]=ws[j-1]+w[j-1];//计算白球的前缀和数组
    }
    vector<ll> mx(n+5,0);
    mx[n]=bs[n];
    for(int i=n-1;i>=0;i--){
        mx[i]=max(bs[i],mx[i+1]);//预处理
    }
    int k=min(m,n);
    ll ans=0;
    for(int i=0;i<=k;i++){//遍历所有可能的白球数量
        ll cnt=ws[i]+mx[i];
        if(cnt>ans){
            ans=cnt;
        }
    }
    cout<<ans;
    return 0;
}