传送门

思路:对于一般情况,我们有三个袋子,容易想到把袋子里物品的价值排序。然后贪心,我们想让最后的价值最大,则三个袋子最后都可以剩余一个物品,这三个物品总和需要最大,最好的情况就是三个物品的符号“+”,“-”,“-”,这样总价值直接可以算是每个袋子中物品绝对值的累加和。为了让三个物品价值最大,我们可以容易想到,价值大的物品减去价值小的物品,让可用价值尽可能大,而且最后剩余每个袋子的最后物品符号分别是“+”“-”“-”。这样,我们之前每个袋子的物品都排好了序,容易想到,对于三个袋子中,每个袋子价值最小的物品是关键。因为我们需要让可用价值尽可能大,所以我们可以让三个袋子中,最小值最大的那个物品为“+”,然后让其他两个袋子中的最小物品收集其他价值,这样就满足了三个袋子都只剩下一个物品且满足“+”“-”“-”。我们可以让最小值最大和最小值中间大的袋子中其他物品累加减去最小值最小的物品让其为“-”,然后让最小值最小的其他物品减去最小值中间大的那个物品让其为“-”就可以了。但最小值最小的其他所有物品和最小值中间大的物品的差值会有特殊情况,例如:最小值的其他物品 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. 如何使用 K8s 两大利器"审计"和"事件"帮你摆脱运维困境?

    概述 下面几个问题,相信广大 K8s 用户在日常集群运维中都曾经遇到过: 集群中的某个应用被删除了,谁干的? Apiserver 的负载突然变高,大量访问失败,集群中到底发生了什么? 集群节点 Not ...

  2. day010|python之装饰器

    装饰器02 目录 装饰器02 1 装饰器的语法糖 1.1 定义 1.2 基本使用 2 有参装饰器 2.1 基本用法 2.2 示例 3叠加多个装饰器 3.1 基本用法 3.2 示例 4 wraps装饰器 ...

  3. Codeforces Edu Round 66 A-E

    A. From Hero to Zero 通过取余快速运行第一步即可.由于\(a \% b (a >= b) <= \frac{a}{2}\).所以总复杂度不超过\(O(log_2n)\) ...

  4. Mycat安全配置

    1. Mycat相关文章   Linux安装Mycat1.6.7.4并实现Mysql数据库读写分离简单配置   Linux安装Mysql8.0.20并配置主从复制(一主一从,双主双从)   Docke ...

  5. 2. 使用Shell能做什么

    批处理 在批处理的过程中,能够实现脚步自动化,比GUI自动化速度高效 日常工作场景 服务端测试 移动端测试 持续集成与自动化部署,这是最最场景的场景,可以说离开了shell,持续集成和自动化部署也会遇 ...

  6. Intellij idea 创建java web

    https://blog.csdn.net/qq_41592771/article/details/80577791 将tomcat服务器lib目录下面的servlet-api.jar复制到lib文件 ...

  7. js上 十三、函数初步-2

    13-1.函数的参数 函数的本质: ü 函数的作用,代码重用,编写一个函数,就是为了解决一类问题. ü 函数每次调用,都有一个结果,那么结果和什么相关呢?y = x , y = x2,y = sin( ...

  8. [日常摸鱼]Luogu2521[HAOI2011]防线修建-set维护凸包

    https://www.luogu.org/problemnew/show/2521 题意:维护一个上凸包:删点,查询周长 很容易想到把问题转换为离线:先读入全部操作,记录下最后剩下的点,倒着加点来维 ...

  9. Spring Data JPA 的 Specifications动态查询

    主要的结构: 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询. ...

  10. IIS本地部署局域网可随时访问的项目

    原理 在本机的IIS下创建一个网站,文件目录直接指向Web项目文件夹 步骤 1.项目的启动项目为web 2.在iis中创建一个新的网站(Work_TK_EIS) 文件目录为web项目的目录(D:\Gi ...