本文最后更新于 201 天前,其中的信息可能已经有所发展或是发生改变。
问题描述
给定 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; }