本文最后更新于 189 天前,其中的信息可能已经有所发展或是发生改变。
问题描述
给定 nn 副卡牌,每张卡牌具有正反面,正面朝上数字为 aiai,背面朝上数字为 bibi。一副卡牌的价值为正面朝上数字之和。一开始所有卡牌都是正面朝上的。小蓝是蓝桥学院最优秀的魔法师,他知道所有卡牌的背面数字 bibi,他最多可以进行 kk 次操作,每次可以将一副卡牌翻转,将正面朝上的数字变为背面朝上的数字,或将背面朝上的数字变为正面朝上的数字。请问,小蓝最多可以使卡牌的价值之和为多少?
输入格式
第一行输入两个整数 nn 和 kk ,表示卡牌的数量和小蓝可以操作的次数。
第二行输入 nn 个整数 aiai,表示所有卡牌正面的数字。
第三行输入 nn 个整数 bibi ,表示所有卡牌反面的数字。
数据范围保证:1≤n≤1×1051≤n≤1×105,1≤ai,bi,k≤1091≤ai,bi,k≤109。
输出格式
输出一个整数,表示可以得到的卡牌的最大价值和。
样例输入
3 1
1 2 3
3 2 1
样例输出
8
说明
将第一张卡牌翻转,此时卡牌的总和为 3+2+3=83+2+3=8。
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 2s | 256M |
C | 2s | 256M |
Java | 3s | 256M |
Python3 | 4s | 256M |
答案解析
#include <iostream>
#include<algorithm>
using namespace std;
bool cmp(long long a,long long b){
return a>b;
}
int main()
{
long long n,k,sum=0;cin>>n>>k;
long long a[n],b[n],c[n];
for(int i = 0;i<n;i++){cin>>a[i];sum+=a[i];}
for(int i = 0;i<n;i++)cin>>b[i];
for(int i = 0;i<n;i++)c[i] = b[i]-a[i];
sort(c,c+n,cmp);
for(int i = 0;i<n;i++){
if(k>0) {
if(c[i]>0){sum+=c[i];k--;}
}
}
cout<<sum<<endl;
return 0;
}