问题 C: 糖果
问题:
一天,小 D 决定买一些糖果。他决定在两家不同的商店中买糖果,来体验更多的口味。
在每家商店中都有 n 颗糖果,每颗糖果都有一个权值:愉悦度,代表小 D觉得这种糖果有多好吃。其中,第一家商店中的第 i 颗糖果的愉悦度为 Ai,而第二家商店中的第 i 颗糖果的愉悦度为 Bi。
在每家商店买的糖果会被打包到一个袋子中(也可以什么都不买,此时认为这家商店的袋子为空)。小 D 回家后,因为这两个袋子外观是一样的,所以他会从两个袋子中随机选择一个,然后吃光里面的糖果。小 D 定义一种买糖果的方案的愉悦度为:吃到的糖果的愉悦度之和的最小可能值。
购买每颗糖果的花费均为 W,小 D 想要最大化:买糖果的愉悦度与买糖果的花费之差(x 与 y 的差即为 x−y),请你帮他求出这个最大值。
输入输出
输入格式
第一行两个空格隔开的整数 n,Wn,W,表示每家商店中的糖果数目以及每颗糖果的花费。
第二行 nn 个空格隔开的整数 A1,A2,?,AnA1,A2,?,An,表示第一家商店中的糖果的愉悦度。
第三行 nn 个空格隔开的整数 B1,B2,?,BnB1,B2,?,Bn,表示第二家商店中的糖果的愉悦度。
保证输入的 {A}{A} 和 {B}{B} 均按照从小到大的顺序排列。
输出格式
输出一行一个整数,表示这个差值的最大值。
样例输入:
4 10
16 14 12 19
20 14 37 15
样例输出:
5
思路:
从大到小贪心处理, 当商店a的购买的总值大于商店b购买的总值,下一个就去商店b购买, 反之去商店a购买
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
#define int long long
int a[N], b[N];
signed main()
{
int n, w;
scanf("%lld%lld", &n, &w);
for(int i = 1; i <= n; i ++)scanf("%lld", &a[i]);
for(int i = 1; i <= n; i ++)scanf("%lld", &b[i]);
int idxa = 1, idxb = 1;
sort(a + 1, a + n + 1, greater<int>());
sort(b + 1, b + n + 1, greater<int>());
int suma = 0, sumb = 0;
int cost = 0;
int ans = 0;
for(int i = 1; i <= n * 2; i ++)
{
if(idxa <= n && idxb <= n)
{
if(!suma && !sumb)
{
if(a[i] > b[i])suma += a[idxa ++];
else sumb += b[idxb ++];
}
else if(suma > sumb)sumb += b[idxb ++];
else suma += a[idxa ++];
}
else if(idxa > n) sumb += b[idxb ++];
else suma += a[idxa ++];
cost += w;
ans = max(ans, min(suma, sumb) - cost);
//cout << ans << ' ' << suma << ' ' << sumb << ' ' << idxa << ' ' << idxb << endl;
}
printf("%lld\n", ans);
return 0;
}

浙公网安备 33010602011771号