背景

6月就要考五级了,来做做题(上次的第一题太难了,先做第二题)。


来源 - 洛谷

P11960 [GESP202503 五级] 平均分配

题目描述

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

输入格式

第一行,一个正整数 nn

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

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

输出格式

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

输入输出样例 #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\% 的测试点,保证 1n81\le n\le8

对于另外 20%20\% 的测试点,保证 0bi10\le b_i\le10ci10\le c_i\le1

对于所有测试点,保证 1n1051\le n\le10^50bi1090\le b_i\le10^90ci1090\le c_i\le10^9


题解

题目意思都看懂了吧:2串2n2n个数,如何分配使总和最大?

首先,假设全部都卖给小B,则此时收益为b数组的总和,即i=12n\sum_{i=1}^{2n}bib_i

当然小C也要,那么定义一个a数组,ai=cibia_i=c_i-b_i,即a的第i项时c的第i项比b的第i项多的收益。

再然后对a进行从大到小排序,取前nn项,即这件物品给小C比给小B多(负数就是少)的收益,用ans加上(这件物品就归小C了,嘿嘿)。

最后输出就好了

时间复杂度:O(nlogn)O(nlogn)这可恶的sort带来的可恶的lognlogn影响美观。

无脑long long,零帧起手你怎么躲

#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
int n, ans, b[1000005], c, a[1000005];
bool cmp(int x, int y)
{
	return x > y;
}
signed main()
{
	cin >> n;
	for (int i = 1; i <= 2 * n; i++)
	{
		cin >> b[i];
		ans += b[i];
	}
	for (int i = 1; i <= 2 * n; i++)
	{
		cin >> c;
		a[i] = c - b[i];
	}
	sort(a + 1, a + 2 * n + 1, cmp);
	for (int i = 1; i <= n; i++)
	{
		ans += a[i];
	}
	cout << ans;
	return 0;
}

别看题解和代码这么短