- gf24240 的博客
《梦溪笔谈·C++》卷二十: [GESP202503 五级] 平均分配
- 2025-5-17 22:29:08 @
背景
6月就要考五级了,来做做题(上次的第一题太难了,先做第二题)。
P11960 [GESP202503 五级] 平均分配
题目描述
小 A 有 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 件物品,小 B 会以 的价格购买,而小 C 会以 的价格购买。为了平均分配这 件物品,小 A 决定小 B 和小 C 各自只能买走恰好 件物品。你能帮小 A 求出他卖出这 件物品所能获得的最大收入吗?
输入格式
第一行,一个正整数 。
第二行, 个整数 。
第三行, 个整数 。
输出格式
一行,一个整数,表示答案。
输入输出样例 #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
说明/提示
数据范围
对于 的测试点,保证 。
对于另外 的测试点,保证 ,。
对于所有测试点,保证 ,,。
题解
题目意思都看懂了吧:2串个数,如何分配使总和最大?
首先,假设全部都卖给小B,则此时收益为b
数组的总和,即。
当然小C也要,那么定义一个a
数组,,即a的第i项时c的第i项比b的第i项多的收益。
再然后对a
进行从大到小排序,取前项,即这件物品给小C比给小B多(负数就是少)的收益,用ans
加上(这件物品就归小C了,嘿嘿)。
最后输出就好了
时间复杂度:。这可恶的sort带来的可恶的影响美观。
无脑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;
}
别看题解和代码这么短