BZOJ 2288: 【POJ Challenge】生日礼物 优先队列+贪心+链表
这题看别人题解的
这题说可以转换成数据备份。
这题可以把一段同号的数并成一个数,那么就变成了一个正负交替的序列,然后把头尾的负数去掉。
然后就是把所有的正值都加起来,并统计正数的段数cnt,如cnt<=m,那么这些整数的和就是答案
如果cnt>m,那我们就要不断地去掉一段,直到cnt=m
先把所有数的绝对值加进优先队列,每次去一个最小的出来然后减掉,最后的即为答案。
为什么是正确的呢?因为如果减去的值在原数列中为正则相当于不要这个数,否则就相当于选了这个负数然后把两边的正值合并起来。
无论减去正数还是负数,都要保证每次操作能够使段数cnt-1,这是我们的目的所在
既如果去掉的是正数,保证了cnt-1,如果去掉了负数,那么要保证它的两边必须要是正数,这样才能使旁边两个正数加上这个负数,使得我们原来取的它的旁边的两段正数加上这个负数后,段数减一,所以处于左右端点的负数都要先去掉
但有一个问题,就是若选了一个数那么其两边的数就必定不能被选,那么就转换成了数据备份了。
真的是被这题搞得快自闭了,自己写的一直wa,经过不断修改代码,两个代码来回交,大概交了40次,才发现我哪里错了
错的l[pos] = l[l[pos]]; r[pos] = r[r[pos]]; r[l[l[pos]]] = pos; l[r[r[pos]]] = pos;
这个是导致我WA了20次的原因,怎么也没想到是这个地方错了,我还在疯狂修改其他地方。
对的 r[l[l[pos]]] = pos; l[r[r[pos]]] = pos; l[pos] = l[l[pos]]; r[pos] = r[r[pos]];
原来错的那个我的 l[pos] 已经先更改过了。
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; const int maxn = 1e5 + 5; int a[maxn], l[maxn], r[maxn],n,m,ans,cnt; bool vis[maxn]; struct data {int val, pos;data(int val1 = 0, int pos1 = 0) { val = val1; pos = pos1; }bool operator < (const data &a) const{return a.val<val;} }; priority_queue<data> que; int main() {cin >> n >> m;int tot = 1;for (int i = 1; i <= n; i++){int tmp;cin >> tmp;if (a[tot] * tmp >= 0) a[tot] += tmp;else a[++tot] = tmp;}int left = 1;if (a[1]<0) left++;if (a[tot]<0) tot--;for (int i = left; i <= tot; i++){if (a[i] > 0) cnt++, ans += a[i];a[i] = abs(a[i]);que.push(data(a[i],i));//que.push(data(a[i],i));l[i] = i - 1;r[i] = i + 1;}l[left]=r[tot] = 0;if (cnt <= m) cout << ans << endl;else{int num = cnt - m;for (int i = 1; i <= num;i++){while (vis[que.top().pos] && !que.empty()) que.pop();int pos = que.top().pos;que.pop();ans -= a[pos];if (!l[pos]) {vis[pos] = vis[r[pos]] = true;l[r[r[pos]]] = 0;}else if (!r[pos]){vis[pos] = vis[l[pos]]=true;r[l[l[pos]]] = 0;}else{vis[l[pos]] = vis[r[pos]] = true;a[pos] = a[l[pos]] + a[r[pos]] - a[pos];que.push(data(a[pos],pos));r[l[l[pos]]] = pos;l[r[r[pos]]] = pos;l[pos] = l[l[pos]];r[pos] = r[r[pos]];}}cout << ans << endl;}return 0; }
View Code
转载于:https://www.cnblogs.com/xiaoguapi/p/10371599.html
BZOJ 2288: 【POJ Challenge】生日礼物 优先队列+贪心+链表相关推荐
- poj 3614 Sunscreen(优先队列+贪心)
Description To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her ...
- BZOJ 2287 POJ Challenge 消失之物
BZOJ题目不完整,看了看题解.发现他们都要取模10,还以为是dp的限制. 改了两小时,之后猛然发现.卧槽原本我少了一个取模. 写法1:暴力写法 最简单的想法(只要你会背包dp) 我在枚举每次不选哪个 ...
- 【BZOJ2288】[POJ Challenge]生日礼物(线段树)
题目来源:BZOJ2288 如果 m=1m=1m=1 我们只需要求最大子段和即可. 但是当 m>1m>1m>1 时,我们的选取可能会产生后效性. 比如说黄色部分是选取一个子段的最优方 ...
- BZOJ 2287 【POJ Challenge】消失之物
2287: [POJ Challenge]消失之物 Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. &q ...
- bzoj2287【POJ Challenge】消失之物 缺一01背包
bzoj2287[POJ Challenge]消失之物 缺一01背包 链接 bzoj 思路 分治solve(l,r,arr)表示缺少物品\([l,r]\)的dp数组arr. 然后solve(l,mid ...
- 2287. 【POJ Challenge】消失之物(数组递推\分治优化背包)
2287. [POJ Challenge]消失之物 这题的思想和P4564 [CTSC2018]假面优化的思想一样,应该反过来说,假面那个题应该是借鉴这题的思路. 显然不能枚举每个物品消失O(n)O( ...
- LeetCode 1642. 可以到达的最远建筑(二分查找 / 优先队列贪心)
文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 优先队列+贪心 1. 题目 给你一个整数数组 heights ,表示建筑物的高度.另有一些砖块 bricks 和梯子 ladders . 你 ...
- 【CF 732E】Sockets(优先队列+贪心)
[CF 732E]Sockets(优先队列+贪心) 题目大意: n台电脑,m个供电器. 每台电脑和每个供电器都有电量,当电脑i的电量和供电器j电量相同时,可以连接供电. 现在提供变压器,可以连接到供电 ...
- bzoj2295【POJ Challenge】我爱你啊*
bzoj2295[POJ Challenge]我爱你啊 题意: 求一个字符串中有多少个"luvletter"(不包括引号).字符串长度≤100000. 题解: 连kmp都不用-- ...
最新文章
- 日记 [2008年03月23日]LINUX网关后面的pptp ***客户机连接***
- FL的萌新之路,开始了!
- 【ArcGIS风暴】ArcGIS10.6获取栅格影像边界范围的三种方法案例详解
- 从Zabbix数据库中提取内存采集的数据,做内存使用率计算
- Cmake安装遇到问题
- Linux如何建立用户(组)及调整用户(组)属性(案列+详细指令)
- 11最接近target的值
- jQuery 的 ajax
- python 批量爬取网页pdf_批量抓取网页pdf文件
- 含耦合电感元件的电路分析
- IDEA git 切换分支产生问题
- java APP支付宝支付
- 新edge保持百度账号登录
- not authorized on test to execute command { $eval: \return 1111\
- 【YOLO】目标检测第三步——用Pascal voc 2012 数据集训练YOLO网络
- ftp 21端口被占用解决办法
- XPDF安装与使用说明
- 16个核心概念带你入门 Kubernetes
- 中兴V880手机的随机软件列表
- 浏览器DNS解析过程
热门文章
- Docker 加速器升级版
- Apache Wicket 7.2.0发布
- 某物流集团企业信息化案例介绍
- Zabbix配置文件详解之服务端——zabbix_server
- windows10下 tensorflow gpu版本安装配置方法
- python如何输出结果为16_python 以16进制打印输出的方法
- Web3.0网关Deeper Network计划于本月末在四个平台上进行IDO
- 济南市区块链产业创新发展行动计划对外公布
- SAP License:SAP 清帐介绍
- Kaggle 数据清洗挑战 Day 4 - 字符编码(Character Encoding)处理