传送门

思路:对于一般情况,我们有三个袋子,容易想到把袋子里物品的价值排序。然后贪心,我们想让最后的价值最大,则三个袋子最后都可以剩余一个物品,这三个物品总和需要最大,最好的情况就是三个物品的符号“+”,“-”,“-”,这样总价值直接可以算是每个袋子中物品绝对值的累加和。为了让三个物品价值最大,我们可以容易想到,价值大的物品减去价值小的物品,让可用价值尽可能大,而且最后剩余每个袋子的最后物品符号分别是“+”“-”“-”。这样,我们之前每个袋子的物品都排好了序,容易想到,对于三个袋子中,每个袋子价值最小的物品是关键。因为我们需要让可用价值尽可能大,所以我们可以让三个袋子中,最小值最大的那个物品为“+”,然后让其他两个袋子中的最小物品收集其他价值,这样就满足了三个袋子都只剩下一个物品且满足“+”“-”“-”。我们可以让最小值最大和最小值中间大的袋子中其他物品累加减去最小值最小的物品让其为“-”,然后让最小值最小的其他物品减去最小值中间大的那个物品让其为“-”就可以了。但最小值最小的其他所有物品和最小值中间大的物品的差值会有特殊情况,例如:最小值的其他物品 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. 从零开始的ssti学习(已填)

    前前言: 本文只是接这个机会来梳理一下ssti的知识点.先说一下,本文目前的重点是Flask的ssti,但是之后会填其他框架的坑.(就不该叫ssti学习,ssti太广了) 涉及知识点: 模板注入 前言 ...

  2. autojs websocket 核心示例代码,云控技术

    //初始化方法 function recordInit(scriptName){ //let ipInfoJson = getIP() // let ip = ipInfoJson.cip // le ...

  3. AcWing 199. 余数之和

    \(\sum_{i = 1}^{n} k \bmod i = n * k - \sum_{i = 1}^{n} \lfloor k / i \rfloor * i\) 显然,\(\lfloor k / ...

  4. git相关操作

    git相关命令 基本操作 git init git add xxx git commit -m "first commit" git tag -a V1.0 -m '我的标签' g ...

  5. Docker部署FastDFS(附示例代码)

    1. FastDFS简介   FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文 ...

  6. AWT08-绘图

    1.组件绘图原理 Java GUI能展示出不同对话框.窗口等等组件外观的本质其实就是绘图. 在AWT中,真正提供绘图功能的是Graphics对象,在Component中提供了三个方法来完成组件图形的绘 ...

  7. MySQL锁(四)行锁的加锁规则和案例

    在上一篇文章,我们学习了间隙锁和next-key lock,但是不知道怎么加锁,有哪些规则.间隙锁的概念不太好理解,尤其是配合上行锁后,很容易在判断是否会出现锁等待的问题上犯错. 今天我们就来学习一下 ...

  8. 面试 15-虚拟DOM

    15-虚拟DOM #前言 vdom 是 vue 和 React 的核心,先讲哪个都绕不开它. vdom 比较独立,使用也比较简单. 如果面试问到 vue 和 React 和实现,免不了问 vdom: ...

  9. webshell学习

    参考文章: https://www.bilibili.com/video/BV1T4411t7BW?p=14 https://blog.csdn.net/mmmsss987/article/detai ...

  10. 工作3年,看啥资料能月薪30K?

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...