题目描述
自从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;
}