题目链接:http://abc062.contest.atcoder.jp/tasks/arc074_b

题意:从3*n个元素中删除n个元素,使得剩余元素中前n个元素的和减后n个元素的和最大;

思路:用b[i]存储前i个元素中选 n 个元素和能达到的最大值,c[i+1]存储后i个元素中选择 n 个元素能达到的最小值;

然后再遍历一次,取 max (b[i]-c[i+1]) 即为答案;

代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <queue>
 4 #define ll long long
 5 using namespace std;
 6
 7 const int MAXN = 3e5+10;
 8 const ll inf = 0x3f3f3f3f3f3f3f3f;
 9 ll a[MAXN], b[MAXN], c[MAXN];
10
11 int main(void){
12     int n;
13     ll cnt1=inf, cnt2=-inf, ans1=0, ans2=0, ans=-inf;
14     scanf("%d", &n);
15     for(int i=1; i<=3*n; i++){
16         scanf("%lld", &a[i]);
17     }
18     priority_queue<ll, vector<ll>, greater<ll> > q1;
19     for(int i=1; i<=2*n; i++){
20         if(i <= n){
21             q1.push(a[i]);
22             ans1 += a[i];
23             b[i] = ans1;
24             continue;
25         }
26         ll cnt = q1.top();
27         if(cnt < a[i]){
28             q1.pop();
29             q1.push(a[i]);
30             ans1 -= cnt;
31             ans1 += a[i];
32         }
33         b[i] = ans1;
34     }
35     priority_queue<ll, vector<ll>, less<ll> > q2;
36     for(int i=3*n; i>n; i--){
37         if(i > 2*n){
38             q2.push(a[i]);
39             ans2 += a[i];
40             c[i] = ans2;
41             continue;
42         }
43         ll cnt = q2.top();
44         if(cnt > a[i]){
45             q2.pop();
46             q2.push(a[i]);
47             ans2 -= cnt;
48             ans2 += a[i];
49         }
50         c[i] = ans2;
51     }
52     for(int i=n; i<=2*n; i++){
53         ans = max(ans, b[i]-c[i+1]);
54     }
55     cout << ans << endl;
56     return 0;
57 }

View Code

转载于:https://www.cnblogs.com/geloutingyu/p/6884226.html

atcode062D(预处理&优先队列)相关推荐

  1. POJ1722二维spfa+优先队列优化

    题意:      给你一个有向图,然后求从起点到终点的最短,但是还有一个限制,就是总花费不能超过k,也就是说每条边上有两个权值,一个是长度,一个是花费,求满足花费的最短长度. 思路:       一开 ...

  2. HDU 1430 魔板(康托展开+BFS+预处理)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  3. HDU - 3533 Escape(预处理+A*)

    题目链接:点击查看 题目大意:题意我感觉描述的很不清楚..是看网上其他大佬的博客总结来的,大意就是我们要从点(0,0)走到点(n,m),然后在一些地方设置了炮塔(炮塔视为墙),可以向一个方向周期性地发 ...

  4. 如何用python进行数据预处理_Python数据预处理

    数据预处理是指在对数据进行数据挖掘之前,先对原始数据进行必要的清洗.集成.转换.离散和规约等一系列的处理工作,已达到挖掘算法进行知识获取研究所要求的最低规范和标准.通常数据预处理包括:数据清洗.数据集 ...

  5. C++ 笔记(32)— 预处理、文件包含include、宏替换define、条件包含ifndef、define

    C/C++预处理器在源代码编译之前对其进行一些文本性质的操作. 它的主要任务包括删除注释 . 插入 #include 指令包含的文件的内容 . 定义和替换由 #defme 指令定义的符号以及确定代码的 ...

  6. GCC 编译 C++ 程序分步骤流程(预处理 gcc -E、编译 gcc -S、汇编 gcc -c 和链接 gcc 以及 gcc -o 选项)

    C 或者 C++ 程序从源代码生成可执行程序的过程,需经历 4 个过程,分别是预处理.编译.汇编和链接. 同样,使用 GCC 编译器编译 C 或者 C++ 程序,也必须要经历这 4 个过程.但考虑在实 ...

  7. 白化(预处理步骤)【转】

    白化(预处理步骤)[转] 介绍 我们已经了解了如何使用PCA降低数据维度.在一些算法中还需要一个与之相关的预处理步骤,这个预处理过程称为白化.举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很 ...

  8. 机器学习PAL数据预处理

    机器学习PAL数据预处理 本文介绍如何对原始数据进行数据预处理,得到模型训练集和模型预测集. 前提条件 完成数据准备,详情请参见准备数据. 操作步骤 登录PAI控制台. 在左侧导航栏,选择模型开发和训 ...

  9. 优先队列的应用 C++实现

    优先队列的应用 C++实现 优先队列可以用堆来实现, 堆底层可以用数组表示, 通过索引关系,可以表示成一颗二叉完全树 C++的STL提供了相应的容器适配器 包含在queue头文件中 下面通过一道题来看 ...

最新文章

  1. 项目管理工具到底应该为谁服务?
  2. 大一就会这么多,还在问有没有前途? | 每日趣闻
  3. 003_支持并发的饿汉单例
  4. 利用Matlab比较IIR和FIR,细说IIR滤波器和FIR滤波器的区别
  5. Listener--------监听器
  6. android 获取ArrayList的Capacity
  7. JavaFX官方教程(十二)之树动画示例
  8. 资源包技巧和最佳实践
  9. java 中文 音序,java 中文字符串数组按照音序排列
  10. 自动Shader优化器glsl_optimizer的编译与使用
  11. 计算机软件著作权登记怎么填写,计算机软件著作权登记申请表填写说明
  12. 比较:Java和python
  13. MybatisPlus的CRUD操作
  14. 了解Spring的变迁从Spring3到Spring5
  15. windows安装ssh服务
  16. gitlab增加p3c-hook强制代码规范
  17. 数电基础知识——原码、反码、补码
  18. html 投票系统,投票系统 html页面
  19. 微服务设计 10 大反模式和陷阱
  20. 中学物理奥林匹克竞赛竞赛大纲

热门文章

  1. 派生类的拷贝构造【C++继承】
  2. 这几个juniper巡检命令超实用
  3. Linux 面试最高频的 5 个基本问题!
  4. android 截屏指定区域,Android截图 截取ContentView 截取指定的View并且保存
  5. centos cmake安装mysql_Centos安装mysql实例教程
  6. mac怎么合并两个容器_PDF怎样合并?在Mac上合并PDF文件的最佳方法
  7. goland创建一个不限长度的字节切片_Go语言入门必知教程-切片
  8. nginx如何处理php请求,Nginx是如何处理HTTP请求的
  9. python预测随机数据_随机森林预测
  10. d-s 多传感器信息融合 matlab实现_自动驾驶中的多传感器融合