思路:相当于交换两个序列的位置,以数列a为所求数列,若数列b某个位置的值小于数列b同样位置的值,则考虑交换此位置的值,因为交换次数有限制,所以优先交换 <<交换价值大的>>
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
typedef pair<int,int> pii;
int a[N],b[N];
int n,k;
priority_queue<pii> que;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
if(a[i]>b[i]){
que.push({a[i]-b[i],i});
}
}
int d=que.size();
int c=min(d,n-k);
for(int i=1;i<=c;i++){
auto t=que.top();
que.pop();
a[t.second]=b[t.second];
}
int sum=0;
for(int i=1;i<=n;i++){
sum=sum+a[i];
}
cout<<sum;
return 0;
}
其实第一眼看到这个题,没分析时间复杂度,直接写的dp
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int a[N],b[N];
int dp[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n,k;
cin>>n>>k;
int ki=n-k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++){
for(int j=ki;j>=0;j--){
if(j==0){
dp[j]=dp[j]+a[i];
}
else{
dp[j]=min(dp[j]+a[i],dp[j-1]+b[i]);
}
}
}
cout<<dp[ki];
return 0;
}