C. Three Bags【CF 1467】


思路:对于一般情况,我们有三个袋子,容易想到把袋子里物品的价值排序。然后贪心,我们想让最后的价值最大,则三个袋子最后都可以剩余一个物品,这三个物品总和需要最大,最好的情况就是三个物品的符号“+”,“-”,“-”,这样总价值直接可以算是每个袋子中物品绝对值的累加和。为了让三个物品价值最大,我们可以容易想到,价值大的物品减去价值小的物品,让可用价值尽可能大,而且最后剩余每个袋子的最后物品符号分别是“+”“-”“-”。这样,我们之前每个袋子的物品都排好了序,容易想到,对于三个袋子中,每个袋子价值最小的物品是关键。因为我们需要让可用价值尽可能大,所以我们可以让三个袋子中,最小值最大的那个物品为“+”,然后让其他两个袋子中的最小物品收集其他价值,这样就满足了三个袋子都只剩下一个物品且满足“+”“-”“-”。我们可以让最小值最大和最小值中间大的袋子中其他物品累加减去最小值最小的物品让其为“-”,然后让最小值最小的其他物品减去最小值中间大的那个物品让其为“-”就可以了。但最小值最小的其他所有物品和最小值中间大的物品的差值会有特殊情况,例如:最小值的其他物品 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】的更多相关文章
- 【CF#338D】GCD Table
[题目描述] 有一张N,M<=10^12的表格,i行j列的元素是gcd(i,j) 读入一个长度不超过10^4,元素不超过10^12的序列a[1..k],问是否在某一行中出现过 [题解] 要保证g ...
- 【CF#303D】Rotatable Number
[题目描述] Bike是一位机智的少年,非常喜欢数学.他受到142857的启发,发明了一种叫做“循环数”的数. 如你所见,142857是一个神奇的数字,因为它的所有循环排列能由它乘以1,2,...,6 ...
- 【CF 463F】Escape Through Leaf
题意 给你一棵 \(n\) 个点的树,每个节点有两个权值 \(a_i,b_i\). 从一个点 \(u\) 可以跳到以其为根的子树内的任意一点 \(v\)(不能跳到 \(u\) 自己),代价是 \(a_ ...
- 【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 ...
- 【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 ...
- 【35.20%】【CF 706D】Vasiliy's Multiset
time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standa ...
- 【26.8%】【CF 46D】Parking Lot
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- 【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 ...
- 【31.95%】【CF 714B】Filya and Homework
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
随机推荐
- [GKCTF2020]CheckIN 注意了解多方面的东西
打开之后是这样的,没有发现反序列化函数,但是发现有一个@eval,想到了一句话,这是用base64进行传参首先传参phpinfo();看看,需要经过base64编码 http://e0cc90ac-d ...
- 攻防世界 web进阶区 ics-06
攻防世界 ics-06 涉及知识点: (1)php://filter协议 (2)php中preg_replace()函数的漏洞 解析: 进入题目的界面,一通乱点点出了唯一一个可以进入的界面. 观察ur ...
- instanceof constructor Object.prototype.tostring.call ( [] )区别 数组和 对象的3中方法
- 文件重命名工具(ReNamer)7.2中文绿色便携专业版
ReNamer 是一个非常强大和灵活的文件重命名工具,它提供所有标准的重命名过程,包括前缀.后缀.替换.大小写更改以及删除括号内容.添加编号规则.更改文件扩展名等.对于高级用户,支持正则表达式和 Pa ...
- Aap.Net中的Action和Func委托
前言 最近在阅读某开源框架源码的时候,发现作者在其中运用了很多Action委托和Func委托,虽然我之前在项目中也有一些对委托的实操,但还是免不了长时间的不用,当初消化的一些委托基础都遗忘了...索性 ...
- EF 查询外键对应的实例
EF 查询外键对应的实例 1. 查询时易遇到的情况: 能查询到外键值,但对应的外键实例为null. 解决方法: (1) 使用EF的include // 我的应用如下 // SampleResult ...
- CF1457D XOR-gun
这道题真的把我秀到了,我首先猜了一波结论,打了一个可持久化 \(\text{Trie}\) 加二分的两只 \(\log_2\) 的做法,发现不能 \(PP\) ,然后就一直改到比赛结束还没改过. 然后 ...
- 题解 CF830D Singer House
\(\texttt{Solution}\) 首先考虑 \(\texttt{dp}\) 维护题目要求的深度为 \(i\), 每个节点最多经过一次的不同有向路径数量 \(f_i\). 明显的,只维护这个东 ...
- 珍藏的C语言编程系列教程
本文有332个文字,大小约为2KB,预计阅读时间1分钟 这是本人珍藏的C语言.C++系列教程. 相信每个Coder的第一门编程语言就是C语言吧, 现在也依然很热门,不谈了.直接上链接,感兴趣的直接存, ...
- 用DirectX 11绘制一个Cube
之前一篇文章讲了如何初始化DirectX 11,现在在此基础上绘制一个Cube,总体可概括为以下几个步骤: 定义Cube顶点数据结构 创建Vertex Buffer和Index Buffer 编写应用 ...