贪心算法-装进肚子

题目描述

自从ZZZZone吃完糖果后,他开始改吃巧克力了,他每天想吃n个巧克力增在甜蜜值,他决定早上吃K个巧克力,晚上吃n - K个巧克力,每个巧克力在早上吃和在晚上吃的甜蜜值是不一样的,他想让自己得到的甜蜜值最大,并想知道最大是多少。

请你编程帮助他。

输入描述

第一行包含两个数n,K表示每天要吃的巧克力数量和要在早上吃的数量。(n <= 100000, K <= n)
第二行包含n个整数Ai(1 <= i <= n) 表示个第i个巧克力在早上吃可得到的甜蜜值 (Ai <= 100000)
第三行包含n个整数Bi(1 <= i <= n) 表示个第i个巧克力在晚上吃可得到的甜蜜值 (Bi <= 100000)

输出描述

输出仅一行包含一个整数表示ZZZZone能获得的最大甜蜜值。

示例

输入

2 1
3 6
2 8

输出

11

解题思路

假设有一块巧克力,早上和晚上的甜蜜值分别为(3, 2),由于3 > 2,所以这块巧克力要放在早上吃,甜蜜值才最大;若早上和晚上的甜蜜值分别为(2, 3),由于2 < 3,所以这块巧克力要放在晚上吃;若早上和晚上的甜蜜值分别为(2, 2),由于2 = 2,所以这块巧克力早上或者晚上吃都可以。

根据上面的想法,可以看出来,将早上的甜蜜值减去晚上的甜蜜值,如果差值 > 0,早上吃;如果差值 < 0,晚上吃;如果差值等于0,早上晚上吃都可以。

这是一块巧克力的情况,如果是多块巧克力呢?不妨以两块巧克力为例,设两块巧克力的早上晚上甜蜜值的差值分别为Δ1,Δ2,两块巧克力晚上的甜蜜度分别为x1, x2。

如果早上吃其中一块,那么晚上就只能吃另外一块,所以这两块巧克力甜蜜值的总和为x1 + x2 + Δ1 或 x1 + x2 + Δ2,如果Δ1 > Δ2,那么x1 + x2 + Δ1就是甜蜜值的最大值。换句话说,早上减去晚上甜蜜值的差值越大的巧克力,在早上吃就能获得越大的甜蜜值。

因此按照这个思路,我们需要将每个巧克力早晚甜蜜值的差值进行排序,靠前的几个放到早上吃,剩下的就是晚上吃。

代码实现

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int n, k;
    cin >> n >> k;
    vector<int> a(n), b(n);
    for (int i = 0; i < n; i++)
        cin >> a[i];
    for (int i = 0; i < n; i++)
        cin >> b[i];
    //定义一个容器存储差值
    vector<pair<int , int> > diff(n);//在两个尖括号中间加一个空格,防止编译器误认为是位移操作符 
    for (int i = 0; i < n; i++)
        diff[i] = make_pair(a[i] - b[i], i);//创建二元函数模板,明确diff中元素的存储值
    //求最大甜蜜值
    long long sweetness = 0;
    sort(diff.begin(), diff.end(), greater<pair<int, int> >());
    for (int i = 0; i < n; i++)
    {
        int index = diff[i].second;
        if (i < k)
            sweetness += a[index];
        else
            sweetness += b[index];
    }
    cout << sweetness << endl;
    
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值