题目描述

ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, …, AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物。
自然地,ftiasch想要知道选择元素之和的最大值。你能帮助她吗?

分析

这道题目还是非常简单的,和数据备份几乎是一样的,吐槽完毕。
参照之前我们的思路,因为是m段不同的部分,那么很明显,一段全是同一符号的一定是一起被一起选走,那么我们首先将原序列变换成只有正负交叉的序列,这样保证了我们能够一次就拿掉整个区间。
因为我们需要让和最大,那么有两种情况:

  • 正数区间
  • 正数区间+负数区间+...

那么我们思考一个贪心,如果一个正数区间非常的大,那么我们一定会选择这个区间,反之如果一个区间非常的小,也就是负数非常的大,那么我们就一定不会选择这个区间。从中显然推出我们需要按照绝对值排序,排序过程用优先队列来实现。
如果一开始正数区间个数就小于了m个,那么就可以直接不用遍历,反之我们需要去掉一些区间:
那么如果选正数,就意味着不选这个数,也就是直接删掉,因为后面还有更优的答案,tot-1。
如果选的是负数,说明左右区间合并,因为我们是绝对值较小,那么对于我们答案的影响一定是最小的,那么tot-1,合并区间。
否则那么就tot+1。
合并区间的操作和数据备份是一样的:https://www.cnblogs.com/chhokmah/p/10557925.html。

ac代码

#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define N 100005
using namespace std;
template <typename T>
inline void read(T &x) {x = 0; T fl = 1;char ch = 0;while (ch < '0' || ch > '9') {if (ch == '-') fl = -1;ch = getchar();}while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}x *= fl;
}
struct node {int id, val;node(int id, int val): id(id), val(val){}bool operator <(const node &rhs) const {return abs(val) > abs(rhs.val);}
};
int a[N], b[N], lst[N], nxt[N];
priority_queue<node> q;
int tot, n, m, ans;
bool vis[N];
void remove(int x) {vis[x] = 1;lst[nxt[x]] = lst[x];nxt[lst[x]] = nxt[x];
}
int main() {memset(vis, 0, sizeof(vis));read(n); read(m);for (int i = 1; i <= n; i ++) read(b[i]);tot = 1;for (int i = 1; i <= n; i ++) {if ((ll)a[tot] * b[i] >= 0) a[tot] += b[i];else a[++ tot] = b[i]; }n = tot;tot = 0;for (int i = 1; i <= n; i ++) {if (a[i] > 0) tot ++, ans += 1ll * a[i];}for (int i = 1; i <= n; i ++) {nxt[i] = i + 1;lst[i] = i - 1;q.push(node(i, a[i]));}while (tot > m) {tot --;while (vis[q.top().id]) q.pop();int x = q.top().id; q.pop();if (lst[x] != 0 && nxt[x] != n + 1) ans -= abs(a[x]);else if (a[x] > 0) ans -= a[x];else {tot ++;continue;}a[x] = a[lst[x]] + a[nxt[x]] + a[x];remove(nxt[x]);remove(lst[x]);q.push(node(x, a[x]));}printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/chhokmah/p/10558237.html

[bzoj2288][pojChallenge]生日礼物【贪心+堆+链表】相关推荐

  1. P3620-[APIO/CTSC2007]数据备份【贪心,堆,链表】

    正题 题目链接:https://www.luogu.com.cn/problem/P3620 题目大意 一条线上有nnn个位置,选出kkk对使得它们的距离差之和最小. 解题思路 因为一定是连接相邻的最 ...

  2. BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2151 是 hydro 的 BZOJ ...

  3. POJ - 1456 贪心 堆常用操作 注意细节

    题意:给定n个商品的deadline和profit,求每天卖一件的情况下的最大获利 显然是一道贪心 按deadline从小到大排序好,动态维护小根(profit)堆的大小<=当前deadline ...

  4. AT3957-[AGC023F]01 on Tree【贪心,堆】

    正题 题目链接:https://www.luogu.com.cn/problem/AT3957 题目大意 nnn个节点的一棵树,每个节点有0/10/10/1.每次删除一个根节点,然后把该节点的值填入序 ...

  5. nssl1148,jzoj5461-购物【可撤回贪心,堆】

    正题 jzoj题目链接:https://jzoj.net/senior/#main/show/5461 题目大意 有n个物品,m元,k个打折券. 每个物品打折前pip_ipi​元,打折后qiq_iqi ...

  6. ssl2331OJ1373-鱼塘钓鱼 之2【贪心堆优化】

    前言 上篇:纯贪心做法 下篇:dp做法 题目:OJ1373 正题 有N个鱼塘,给出每分钟可以钓到的鱼数和每钓一次下一次钓减少的鱼数和到下一个鱼塘需要几分钟(不能回头).求限定时间内最多能够钓到的鱼数 ...

  7. [APIO/CTSC 2007]数据备份(贪心+堆)

    你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣. ...

  8. 【BZOJ1826】【tyvj2644】缓存交换,贪心+堆维护

    传送门1 传送门2 写在前面:Shallwe回家养病依然努力刷题,实乃我辈楷模 思路:比较容易想到的贪心思路(虽然一开始我对这个思路有点虚,因为太弱不会证明,大体理解一下就好= =),用堆维护一下ne ...

  9. 【bzoj1572】[Usaco2009 Open]工作安排Job 贪心+堆

    题目描述 Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单位时间(!). ...

最新文章

  1. miui通知栏要点两下_MIUI免费主题分享,半透明通知栏很好看,另附壁纸!
  2. 数据可视化之 星图
  3. 电脑服务器怎么打开网页,电脑的iis服务器打开网页的方法
  4. ks检验正态分布结果_数据分析基础(2)——正态分布检验
  5. Contest Hunter CH6201 走廊泼水节 最小生成树 Kruskal
  6. 解决2003不支持FLV的方法
  7. jQuery下的ajax【5分钟掌握】
  8. 手机开启热点给其他设备上网和用插卡随身路由给其他设备上网有何区别呢?
  9. 在C#中ParameterizedThreadStart和ThreadStart区别
  10. 如何搭建一个spring boot项目
  11. Security+ 学习笔记36 嵌入式系统安全
  12. ISO 28000供应链安全管理简述及标准
  13. (2)JfreeChart之柱状图与折线图复合图
  14. 找工作,还是找户口?
  15. signature=735f4378ec01919f23285d0d2557be19,OPENSSL编程 第二十章 椭圆曲线
  16. 《崩坏3》评测:游戏设计中整体性和利用率分析(下)
  17. 堆优化版迪杰斯特拉(Dijkstra)算法简单分析
  18. 用vue实现打印页面的几种方法
  19. adf机器_adf(adf文件转成shp)
  20. DEM分辨率与比例尺

热门文章

  1. Swift之高德地图自定义标注弹出气泡样式
  2. Js:DOM对象操作常用的方法和属性
  3. 手机视频直播解决方案
  4. es-04-mapping和setting的建立
  5. python-os模块
  6. 一大波 Android 刘海屏来袭,全网最全适配技巧!
  7. linux常用命令之lsof 、netstat、ipcs、ldd
  8. Visual Studio 2017最新版正式发布!适用于任何开发人员、平台及APP丨附下载
  9. VMware中装Win2012并配置Hyper-v
  10. 如何让PhpStorm同时打开多个项目?(多项目并存的问题)