难度普及/提高−
题目描述
小 A 有 2n 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 i 件物品,小 B 会以 bi 的价格购买,而小 C 会以 ci 的价格购买。为了平均分配这 2n 件物品,小 A 决定小 B 和小 C 各自只能买走恰好 n 件物品。你能帮小 A 求出他卖出这 2n 件物品所能获得的最大收入吗?
输入格式
第一行,一个正整数 n。
第二行,2n 个整数 b1,b2,…,b2n。
第三行,2n 个整数 c1,c2,…,c2n。
输出格式
一行,一个整数,表示答案。
输入输出样例
输入 #1复制
3 1 3 5 6 8 10 2 4 6 7 9 11
输出 #1复制
36
输入 #2复制
2 6 7 9 9 1 2 10 12
输出 #2复制
35
说明/提示
数据范围
对于 20% 的测试点,保证 1≤n≤8。
对于另外 20% 的测试点,保证 0≤bi≤1,0≤ci≤1。
对于所有测试点,保证 1≤n≤105,0≤bi≤109,0≤ci≤109。
#include <bits/stdc++.h> #define int long long using namespace std; const int N=2*1e5+10; int n,ans,C,B; struct stu{ int c, b, res; }a[N]; bool cmp (stu x,stu y){ return x.res>y.res; } signed main(){ cin>>n; for(int i=1;i<=n*2;i++) cin>>a[i].b; for(int i=1;i<=n*2;i++) cin>>a[i].c; for(int i=1;i<=n*2;i++) a[i].res=abs(a[i].c-a[i].b);//记录差 sort(a+1,a+n*2+1,cmp);//降序排序 for(int i=1;i<=n*2;i++){ if(a[i].b>a[i].c){//小B优 if(B<n){ B++; ans+=a[i].b; } else{ C++; ans+=a[i].c; } } else if(a[i].c>a[i].b){//小C更优 if(C<n){ C++; ans+=a[i].c; } else{ B++; ans+=a[i].b; } } else{//出价相同 if(C<n){ C++; ans+=a[i].c; } else{ B++; ans+=a[i].b; } } } cout<<ans; return 0; }