一,思路:对于这种情况很多的题目,就可以试着看看能不能枚举来实现,这题的q很小,所以枚举所以情况肯定可以的。
二,代码:
#include <iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<vector>
using namespace std;
const int N=1e5+10,M=1e9+7;
typedef long long ll;
typedef pair<int,int> pii;
ll arr[N],brr[N];
int query[N];
void Solved() {
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>arr[i];
for(int j=1;j<=n;j++) cin>>brr[j];
while(q--){
//用堆来维护前i个brr最小的前k个数(大顶堆)
priority_queue<int> heap;
int k;
cin>>k;
ll ans=1e18;
ll sum1=0,sum2=0;
for(int i=1;i<=n;i++){
sum1+=arr[i];
sum2+=brr[i],heap.push(brr[i]);
//当堆的元素个数超过k时就把里面最大的给弹出,留下最小的k个
if(heap.size()>k) {
sum2-=heap.top();
heap.pop();
}
//当堆元素个数等于k的时候,说明这是一种情况,比较以下前面枚举的情况,取最小值
if(heap.size()==k) ans=min(ans,sum1+sum2);
}
cout<<ans<<endl;
}
}
int main()
{
int t;
t=1;
while(t--) {
Solved();
}
return 0;
}