思路:

放个题解好吧.

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 贪心 +链表相关推荐

  1. BZOJ 2288: 【POJ Challenge】生日礼物 优先队列+贪心+链表

    这题看别人题解的 这题说可以转换成数据备份. 这题可以把一段同号的数并成一个数,那么就变成了一个正负交替的序列,然后把头尾的负数去掉. 然后就是把所有的正值都加起来,并统计正数的段数cnt,如cnt& ...

  2. UOJ.386.[UNR #3]鸽子固定器(贪心 链表)

    题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品 ...

  3. bzoj 2563 贪心 思想

    BZOJ2563阿狸和桃子的游戏 2563: 阿狸和桃子的游戏 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 952  Solved: 682 [Su ...

  4. bzoj 1029 贪心

    贪心的一种,维护一种尽可能优的状态(即不会比最优解差),将这种状态保持到最后. 1 /********************************************************* ...

  5. bzoj 1634 贪心

    题意:送n头牛回牛棚,每送一头牛消耗的时间为2*Ti 分钟,同时如果第i头牛没有被送回会每分钟啃食Di花朵,求把所有牛送回最少被啃食的花朵 贪心 令sum表示除去第i头牛和第j头牛外,其余没有被送回的 ...

  6. bzoj 3671 贪心

    想到了从小到大依次填,但想到可能有重复元素,那是就会有分支,就不知怎样办了,最后才发现它是用随机数来调整排列,所以没有重复元素,唉..... 1 /************************** ...

  7. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  8. JSOI2010 BZOJ1826 缓存交换

    洛谷 BZOJ 分析 贪心策略很好想,显然,当 \(cache\) 未满时,直接放进去就行了: \(cache\) 满了的时候,考虑交换哪一个,不难看出可以交换下一次出现最晚的那个. 注意:不开 \( ...

  9. 0x10基本数据结构

    0x11 栈 栈是一种后进先出的线性数据结构 AcWing 41.包含min函数的栈 维护两个栈,一个记录栈的值,另一个单调栈,记录下当前的最小值即可 coding AcWing 128. 编辑器 开 ...

最新文章

  1. 感觉皮层实质性参与工作记忆的信息保存
  2. C++ STL标准模板库(queue)
  3. 解决sql脚本文件太大无法打开的问题
  4. 伺服速度控制模式接线图_伺服驱动器控制模式的接线及其注意事项
  5. window10运行不了1stopt_1stopt点击运行没有反应求大佬指点
  6. 【老生谈算法】matlab实现Dijkstra最短路算法源码——Dijkstra算法
  7. tensorflow with求导_Tensorflow 是如何求导的?
  8. Android 常用开发工具以及Mac常用软件
  9. Win Form图形编程实践——打砖块
  10. 2020计算机专硕考数二的学校,2020考研备考:考研数一、数二、数三哪个最难?...
  11. 《暗时间》----读书笔记
  12. 电子计算机发展经历几个阶段,计算机的发展经历几个阶段?每个阶段的电子原件及特征主要概述...
  13. scaling之旅_【scaling】什么意思_英语scaling的翻译_音标_读音_用法_例句_在线翻译_有道词典...
  14. 旅游流的概念_国内旅游流综述
  15. 36篇精品文章搞定所有TOEIC单词
  16. 电脑出现An operating system wasn‘t found,please to Ctrl+alt+del如何解决
  17. 数字电路——余3循环码
  18. 关于ionic环境卸载
  19. html盒子整体向下移动,盒子上下左右居中方法全(持续更新中)
  20. 活在当下——一条狗的使命

热门文章

  1. else if mybatis 嵌套_mybatis踩坑之——foreach循环嵌套if判断
  2. JavaWeb-JavaMail邮件开发
  3. Oralce 目录结构
  4. latex 1图加标题_学习|Latex排版
  5. 安卓9.0刷linux,Ubuntu系统下编译Android 9.0系统
  6. win32 api setwindowlong 第2个参数_FME与MapBox 01:等时圈(Isochrone)API
  7. php mysql不大小写吗,PHP+MYSQL大小写有关问题
  8. 数据库系统概论:第八章 数据库编程
  9. LetCode: 150. 逆波兰表达式求值
  10. [SIGMOD 10] Pregel 基于BSP的大规模图处理系统 学习总结