传送门

思路:对于一般情况,我们有三个袋子,容易想到把袋子里物品的价值排序。然后贪心,我们想让最后的价值最大,则三个袋子最后都可以剩余一个物品,这三个物品总和需要最大,最好的情况就是三个物品的符号“+”,“-”,“-”,这样总价值直接可以算是每个袋子中物品绝对值的累加和。为了让三个物品价值最大,我们可以容易想到,价值大的物品减去价值小的物品,让可用价值尽可能大,而且最后剩余每个袋子的最后物品符号分别是“+”“-”“-”。这样,我们之前每个袋子的物品都排好了序,容易想到,对于三个袋子中,每个袋子价值最小的物品是关键。因为我们需要让可用价值尽可能大,所以我们可以让三个袋子中,最小值最大的那个物品为“+”,然后让其他两个袋子中的最小物品收集其他价值,这样就满足了三个袋子都只剩下一个物品且满足“+”“-”“-”。我们可以让最小值最大和最小值中间大的袋子中其他物品累加减去最小值最小的物品让其为“-”,然后让最小值最小的其他物品减去最小值中间大的那个物品让其为“-”就可以了。但最小值最小的其他所有物品和最小值中间大的物品的差值会有特殊情况,例如:最小值的其他物品 1,1;中间值的最小值 4.这样(4-1-1 = 2),这里需要特判一下,我们发现两者的差值只需要取一个abs就可以了,上面的例子可以转化为:1 - 中间值放入最小值的袋中,变成了abs(-3+1)。

然后就是特殊情况,即三个袋子中任意一个袋子的物品只有一个的情况,需要特殊判断。

 1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <cstring>
5 #include <cmath>
6 #include <queue>
7 #include <vector>
8 #include <cstring>
9 #include <functional>
10 #include <map>
11 #define LL long long
12 #define lson(rt) (rt << 1)
13 #define rson(rt) (rt << 1 | 1)
14 using namespace std;
15
16 const int N = 1e3 + 10;
17 struct node
18 {
19 int v, id;
20
21 bool friend operator<(const node& a, const node& b)
22 {
23 return a.v < b.v;
24 }
25 };
26 int a[N];
27
28 void solve ()
29 {
30 int n, m, k, x;
31 scanf("%d%d%d", &n, &m, &k);
32 vector<int > a[3];
33 for(int i = 0; i < n; ++i) {
34
35 scanf("%d", &x);
36 a[0].push_back(x);
37 }
38 for(int i = 0; i < m; ++i) {
39 scanf("%d", &x);
40 a[1].push_back(x);
41 }
42 for(int i = 0; i < k; ++i) {
43 scanf("%d", &x);
44 a[2].push_back(x);
45 }
46 for(int i = 0; i < 3; ++i) sort(a[i].begin(), a[i].end());
47
48 vector<node > vn;
49 vn.push_back({a[0][0], 0});
50 vn.push_back({a[1][0], 1});
51 vn.push_back({a[2][0], 2});
52
53 sort(vn.begin(), vn.end());
54
55
56 int maxx = vn[2].id;
57 int midd = vn[1].id;
58 int minn = vn[0].id;
59
60 long long maxv, midv, minv;
61 maxv = midv = minv = 0;
62 for(auto x : a[maxx]) maxv += x;
63 for(auto x : a[midd]) midv += x;
64 for(auto x : a[minn]) minv += x;
65 // printf("(%lld %lld %lld)\n", maxv, midv,minv);
66 midv -= a[midd][0];
67 minv -= a[minn][0];
68 maxv -= a[maxx][0];
69 // printf("(%lld %lld %lld)\n", maxv, midv,minv);
70 // printf("(%d %d %d)\n", a[maxx].size(), a[midd].size(), a[minn].size());
71 long long ans = 0;
72 if(a[minn].size() == 1) {
73 ans += maxv + midv + a[maxx][0] + a[midd][0] - a[minn][0];
74 } else if(a[midd].size() == 1) {
75 // cout << "s" << endl;
76 ans += abs(minv + a[minn][0] - a[midd][0]);
77 ans += a[maxx][0] + maxv;
78 } else if(a[maxx].size() == 1 && a[maxx][0] < a[midd][0] + a[minn][0]) {
79 ans += midv + minv + a[midd][0] + a[minn][0] - a[maxx][0];
80 } else {
81 // cout << "s" << endl;
82 ans += a[maxx][0] + maxv + midv - a[minn][0];
83 ans += abs(minv - a[midd][0]);
84 }
85
86 printf("%lld\n", ans);
87 }
88
89 int main ()
90 {
91
92 solve();
93
94 return 0;
95 }

C. Three Bags【CF 1467】的更多相关文章

  1. 【CF#338D】GCD Table

    [题目描述] 有一张N,M<=10^12的表格,i行j列的元素是gcd(i,j) 读入一个长度不超过10^4,元素不超过10^12的序列a[1..k],问是否在某一行中出现过 [题解] 要保证g ...

  2. 【CF#303D】Rotatable Number

    [题目描述] Bike是一位机智的少年,非常喜欢数学.他受到142857的启发,发明了一种叫做“循环数”的数. 如你所见,142857是一个神奇的数字,因为它的所有循环排列能由它乘以1,2,...,6 ...

  3. 【CF 463F】Escape Through Leaf

    题意 给你一棵 \(n\) 个点的树,每个节点有两个权值 \(a_i,b_i\). 从一个点 \(u\) 可以跳到以其为根的子树内的任意一点 \(v\)(不能跳到 \(u\) 自己),代价是 \(a_ ...

  4. 【CF 453A】 A. Little Pony and Expected Maximum(期望、快速幂)

    A. Little Pony and Expected Maximum time limit per test 1 second memory limit per test 256 megabytes ...

  5. 【CF 585E】 E. Present for Vitalik the Philatelist

    E. Present for Vitalik the Philatelist time limit per test 5 seconds memory limit per test 256 megab ...

  6. 【35.20%】【CF 706D】Vasiliy's Multiset

    time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standa ...

  7. 【26.8%】【CF 46D】Parking Lot

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  8. 【31.42%】【CF 714A】Meeting of Old Friends

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  9. 【31.95%】【CF 714B】Filya and Homework

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

随机推荐

  1. SLR(1)语法分析(JAVA实现)

    要求 代码 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util. ...

  2. element ui中表格table翻页记忆勾选状态

    <el-table ref="multipleTable" :data="datalist" style="width:100%" @ ...

  3. nginx根据http请求,将JSON的请求转发到后端,将非JSON请求,转发到前端

    nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; defaul ...

  4. html标签学习2

    input 系列 <form enctype="multipart/form-data"> <input type="text" name=& ...

  5. 关于 SFML 在 Visual Studio下的环境搭建

    SFML 全称 Simple and Fast Multimedia Library,它是一个开放源代码,跨平台,支持多种编程语言绑定,并且提供简单易用的接口,用于多媒体程序和游戏开发,是替代SDL的 ...

  6. django 验证码

    1.django 缓存设置 django的六种缓存(mysql+redis) :https://www.cnblogs.com/xiaonq/p/7978402.html#i6 1.1 安装Djang ...

  7. 求求你,别再用wait和notify了!

    Condition 是 JDK 1.5 中提供的用来替代 wait 和 notify 的线程通讯方法,那么一定会有人问:为什么不能用 wait 和 notify 了? 哥们我用的好好的.老弟别着急,听 ...

  8. 精尽Spring MVC源码分析 - HandlerMapping 组件(四)之 AbstractUrlHandlerMapping

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  9. 【PY从0到1】第一节 安装与界面介绍

    本系列是介绍如何用Python进行股票量化交易的课程. 课程内容以记录Python零基础学员从最简单的Python下载及安装开始,到最后能熟练运用Python进行量化交易的专业人员的成长历程.旨在打造 ...

  10. Salesforce LWC学习(二十九) getRecordNotifyChange(LDS拓展增强篇)

    本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/data_ui_api https ...