问题 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;
}
posted @ 2021-07-27 11:02  梨花满地  阅读(234)  评论(0)    收藏  举报