P11960 [GESP202503 五级] 平均分配

题目描述

小 A 有 2n2n2n 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 iii 件物品,小 B 会以 bib_ibi 的价格购买,而小 C 会以 cic_ici 的价格购买。为了平均分配这 2n2n2n 件物品,小 A 决定小 B 和小 C 各自只能买走恰好 nnn 件物品。你能帮小 A 求出他卖出这 2n2n2n 件物品所能获得的最大收入吗?

输入格式

第一行,一个正整数 nnn

第二行,2n2n2n 个整数 b1,b2,…,b2nb_1,b_2,\dots,b_{2n}b1,b2,,b2n

第三行,2n2n2n 个整数 c1,c2,…,c2nc_1,c_2,\dots,c_{2n}c1,c2,,c2n

输出格式

一行,一个整数,表示答案。

输入输出样例 #1

输入 #1

3
1 3 5 6 8 10
2 4 6 7 9 11

输出 #1

36

输入输出样例 #2

输入 #2

2
6 7 9 9
1 2 10 12

输出 #2

35

说明/提示

数据范围

对于 20%20\%20% 的测试点,保证 1≤n≤81\le n\le81n8

对于另外 20%20\%20% 的测试点,保证 0≤bi≤10\le b_i\le10bi10≤ci≤10\le c_i\le10ci1

对于所有测试点,保证 1≤n≤1051\le n\le10^51n1050≤bi≤1090\le b_i\le10^90bi1090≤ci≤1090\le c_i\le10^90ci109

解析

贪心策略,把价差小的卖给小B,价差大的卖给小C,详见代码:

#include<bits/stdc++.h>
using namespace std;
int n;
struct node {//每款商品的两种售价
    int b, c;
};
node a[200005];
long long ans = 0;
bool cmp(node x, node y) {//按价差从小到大排序
    return x.c - x.b < y.c - y.b;
}
int 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;
    }
    sort(a + 1, a + 2 * n + 1, cmp);//排序
    for(int i = 1; i <= 2 * n; i++) {//遍历每个商品
        if (i <= n) {//前n个价差小的卖给小B
            ans += a[i].b;
        } else {//其他的卖给小C
            ans += a[i].c;
        }
    }
    cout << ans;
    return 0;
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐