BZOJ 2288 贪心 +链表
思路:
放个题解好吧.
http://www.cnblogs.com/zyfzyf/p/4114774.html
//By SiriusRen #include <queue> #include <cstdio> #include <algorithm> using namespace std; const int N=100050; int a[N],s[N],top,n,m,add,minu,tot,next[N],pre[N],vis[N]; struct Node{int v,id;Node(){}Node(int x,int y){v=x,id=y;}}; bool operator<(Node a,Node b){return a.v>b.v;} priority_queue<Node>pq; long long ans; signed main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]>0){add+=a[i];if(minu&&top)s[++top]=minu;minu=0;}else if(a[i]<0){minu+=a[i];if(add)s[++top]=add;add=0;}}if(add)s[++top]=add;for(int i=1;i<=top;i++){if(s[i]>0)pq.push(Node(s[i],i)),tot++,ans+=s[i];else pq.push(Node(-s[i],i)),s[i]=-s[i];next[i]=i+1,pre[i]=i-1;}next[top]=0;if(tot<=m){printf("%d\n",ans);return 0;}else{for(int i=1;i<=tot-m;i++){Node tp=pq.top();pq.pop();while(vis[tp.id]&&!pq.empty())tp=pq.top(),pq.pop();if(vis[tp.id])break;ans-=tp.v;if(pq.empty())break;int x=tp.id;if(!pre[x]){vis[next[x]]=vis[x]=1;pre[next[next[x]]]=0;}else if(!next[x]){vis[x]=vis[pre[x]]=1;next[pre[pre[x]]]=0;}else{vis[pre[x]]=vis[next[x]]=1;tp.v=s[x]=s[pre[x]]+s[next[x]]-s[x];if(next[next[x]])pre[next[next[x]]]=x;if(pre[pre[x]])next[pre[pre[x]]]=x;pre[x]=pre[pre[x]];next[x]=next[next[x]];pq.push(tp);} }printf("%d\n",ans);} }
//By SiriusRen
#include <queue>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=100050;
int a[N],s[N],top,n,m,add,minu,tot,next[N],pre[N],vis[N];
struct Node{ int v,id;Node(){}Node( int x, int y){v=x,id=y;}};
bool operator<(Node a,Node b){ return a.v>b.v;}
priority_queue<Node>pq;
long long ans;
signed main(){
scanf ( "%d%d" ,&n,&m);
for ( int i=1;i<=n;i++){
scanf ( "%d" ,&a[i]);
if (a[i]>0){
add+=a[i];
if (minu&&top)s[++top]=minu;
minu=0;
}
else if (a[i]<0){
minu+=a[i];
if (add)s[++top]=add;
add=0;
}
}
if (add)s[++top]=add;
for ( int i=1;i<=top;i++){
if (s[i]>0)pq.push(Node(s[i],i)),tot++,ans+=s[i];
else pq.push(Node(-s[i],i)),s[i]=-s[i];
next[i]=i+1,pre[i]=i-1;
}next[top]=0;
if (tot<=m){
printf ( "%d\n" ,ans);
return 0;
}
else {
for ( int i=1;i<=tot-m;i++){
// for(int j=1;j<=top;j++)printf("%d ",next[j]);puts("");
// printf("ans=%d\n",ans);
Node tp=pq.top();pq.pop();
while (vis[tp.id]&&!pq.empty())
tp=pq.top(),pq.pop();
if (vis[tp.id]) break ;
ans-=tp.v;
// printf("v=%d\n",tp.v);
if (pq.empty()) break ;
int x=tp.id;
if (!pre[x]){
vis[next[x]]=vis[x]=1;pre[next[next[x]]]=0;
}
else if (!next[x]){
vis[x]=vis[pre[x]]=1;next[pre[pre[x]]]=0;
}
else {
vis[pre[x]]=vis[next[x]]=1;
tp.v=s[x]=s[pre[x]]+s[next[x]]-s[x];
if (next[next[x]])pre[next[next[x]]]=x;
if (pre[pre[x]])next[pre[pre[x]]]=x;
pre[x]=pre[pre[x]];next[x]=next[next[x]];
pq.push(tp);
}
// for(int j=1;j<=top;j++)printf("%d ",next[j]);puts("");
}
printf ( "%d\n" ,ans);
}
}
|
转载于:https://www.cnblogs.com/SiriusRen/p/6592626.html
BZOJ 2288 贪心 +链表相关推荐
- BZOJ 2288: 【POJ Challenge】生日礼物 优先队列+贪心+链表
这题看别人题解的 这题说可以转换成数据备份. 这题可以把一段同号的数并成一个数,那么就变成了一个正负交替的序列,然后把头尾的负数去掉. 然后就是把所有的正值都加起来,并统计正数的段数cnt,如cnt& ...
- UOJ.386.[UNR #3]鸽子固定器(贪心 链表)
题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品 ...
- bzoj 2563 贪心 思想
BZOJ2563阿狸和桃子的游戏 2563: 阿狸和桃子的游戏 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 952 Solved: 682 [Su ...
- bzoj 1029 贪心
贪心的一种,维护一种尽可能优的状态(即不会比最优解差),将这种状态保持到最后. 1 /********************************************************* ...
- bzoj 1634 贪心
题意:送n头牛回牛棚,每送一头牛消耗的时间为2*Ti 分钟,同时如果第i头牛没有被送回会每分钟啃食Di花朵,求把所有牛送回最少被啃食的花朵 贪心 令sum表示除去第i头牛和第j头牛外,其余没有被送回的 ...
- bzoj 3671 贪心
想到了从小到大依次填,但想到可能有重复元素,那是就会有分支,就不知怎样办了,最后才发现它是用随机数来调整排列,所以没有重复元素,唉..... 1 /************************** ...
- 一句话题解(20170801~20170125)
8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...
- JSOI2010 BZOJ1826 缓存交换
洛谷 BZOJ 分析 贪心策略很好想,显然,当 \(cache\) 未满时,直接放进去就行了: \(cache\) 满了的时候,考虑交换哪一个,不难看出可以交换下一次出现最晚的那个. 注意:不开 \( ...
- 0x10基本数据结构
0x11 栈 栈是一种后进先出的线性数据结构 AcWing 41.包含min函数的栈 维护两个栈,一个记录栈的值,另一个单调栈,记录下当前的最小值即可 coding AcWing 128. 编辑器 开 ...
最新文章
- 感觉皮层实质性参与工作记忆的信息保存
- C++ STL标准模板库(queue)
- 解决sql脚本文件太大无法打开的问题
- 伺服速度控制模式接线图_伺服驱动器控制模式的接线及其注意事项
- window10运行不了1stopt_1stopt点击运行没有反应求大佬指点
- 【老生谈算法】matlab实现Dijkstra最短路算法源码——Dijkstra算法
- tensorflow with求导_Tensorflow 是如何求导的?
- Android 常用开发工具以及Mac常用软件
- Win Form图形编程实践——打砖块
- 2020计算机专硕考数二的学校,2020考研备考:考研数一、数二、数三哪个最难?...
- 《暗时间》----读书笔记
- 电子计算机发展经历几个阶段,计算机的发展经历几个阶段?每个阶段的电子原件及特征主要概述...
- scaling之旅_【scaling】什么意思_英语scaling的翻译_音标_读音_用法_例句_在线翻译_有道词典...
- 旅游流的概念_国内旅游流综述
- 36篇精品文章搞定所有TOEIC单词
- 电脑出现An operating system wasn‘t found,please to Ctrl+alt+del如何解决
- 数字电路——余3循环码
- 关于ionic环境卸载
- html盒子整体向下移动,盒子上下左右居中方法全(持续更新中)
- 活在当下——一条狗的使命
热门文章
- else if mybatis 嵌套_mybatis踩坑之——foreach循环嵌套if判断
- JavaWeb-JavaMail邮件开发
- Oralce 目录结构
- latex 1图加标题_学习|Latex排版
- 安卓9.0刷linux,Ubuntu系统下编译Android 9.0系统
- win32 api setwindowlong 第2个参数_FME与MapBox 01:等时圈(Isochrone)API
- php mysql不大小写吗,PHP+MYSQL大小写有关问题
- 数据库系统概论:第八章 数据库编程
- LetCode: 150. 逆波兰表达式求值
- [SIGMOD 10] Pregel 基于BSP的大规模图处理系统 学习总结