题意

有围成一圈的n个位置,每一个位置有一个权值,现要求选出m个位置,使得这m个位置互不相邻且权值和最大。
n<=200000

分析

如果没有m这个限制的话我可能就会跑去写网络流了……

我们考虑如果没有互不相邻这个限制的话要怎么做,很显然就是直接用优先队列取出前m大的即可。
但加上这个限制呢?我们考虑还是这样来做,那么取出一个最大的,假设下标为x,那么x+1和x-1一起选的话有可能是比选x要优的。但可以分析到x+1和x-1不可能只选一个,那么就可以把这三件物品合为一件,权值为a[x+1]+a[x-1]-a[x],然后把原来的三件物品删掉即可。
可以用双向链表来维护。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#define N 200005
using namespace std;struct data
{int val,pos;bool operator < (const data &a) const{return val<a.val;}
};priority_queue <data> q;
int n,m,a[N],next[N],last[N],vis[N];int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){scanf("%d",&a[i]);data u;u.val=a[i];u.pos=i;q.push(u);next[i]=i+1;last[i]=i-1;}next[n]=1;last[1]=n;if (n<m*2){printf("Error!");return 0;}int ans=0;for (int i=1;i<=m;i++){data u=q.top();q.pop();while (vis[u.pos]&&!q.empty()){u=q.top();q.pop();}ans+=u.val;int x=u.pos;data v;v.pos=x;v.val=a[x]=a[last[x]]+a[next[x]]-a[x];q.push(v);next[last[last[x]]]=x;last[next[next[x]]]=x;vis[next[x]]=1;vis[last[x]]=1;next[x]=next[next[x]];last[x]=last[last[x]];}printf("%d",ans);return 0;
}

bzoj 2151: 种树 贪心+优先队列相关推荐

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

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

  2. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  3. BZOJ 3119 Book (贪心+数学推导)

    BZOJ 3119 Book (贪心+数学推导) 手动博客搬家: 本文发表于20191029 22:49:41, 原地址https://blog.csdn.net/suncongbo/article/ ...

  4. 1163 最高的奖励(贪心+优先队列)

    有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成该任务,就可以获得对应的奖励.完成每一个任务所需的时间都是1个单位时间.有时候完成所有任务是不可能的,因为时间上可能会有冲突 ...

  5. 贪心+优先队列 HDOJ 5360 Hiking

    题目传送门 1 /* 2 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 3 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小, ...

  6. 贪心(优先队列) - New Year Snowmen - CodeForces - 140C

    贪心(优先队列) - New Year Snowmen - CodeForces - 140C 题意: 给定一个长度为n的正整数序列a1,a2,...,an.给定一个长度为n的正整数序列a_1,a_2 ...

  7. CodeForces 140C New Year Snowmen (贪心+优先队列)

    题意:n个数,选三个严格下降的数为一组,求最多能选多少组,并列出每组哪些数. 题解:贪心+优先队列 最多能选多少组,那么必须贪心数量多的. 例如:1 1 2 3 4 5 如果按照数的大小排序,只能贪到 ...

  8. CF140C New Year Snowmen(贪心+优先队列)

    CF140C 贪心+优先队列 贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成 雪球数用优先队列维护 #include <bits/ ...

  9. 【BHOJ 女娲加农炮 |、||】贪心 | 优先队列 | 堆 | E

    这次我们通过两道例题来总结一下优先队列的用法和实现: 目录: [BHOJ 1512]女娲加农炮 [BHOJ 1517]女娲加农炮II [BHOJ 1512]女娲加农炮 核心:贪心 + 优先队列 URL ...

最新文章

  1. 照片墙瀑布流加载与阻止加载
  2. Go to sleep
  3. 表的字段中的值需要替换怎么办?【if 函数,case when函数,中间表思路】
  4. linux一步一脚印---more、less、head、tail
  5. list.php tid= field,dedecms列表页模板中调用当前栏目文章数
  6. Android开发笔记(一百五十八)运行时动态授权管理
  7. DataSetProvider的Option属性
  8. go home(2)-supprise
  9. ubuntu安装java虚拟机
  10. 微信支付基于图计算的反欺诈实践
  11. c语言线性链表的插入,线性链表的创建_插入_删除_操作_C语言
  12. 软件设计师考试真题链接
  13. C++ 167. 两数之和 II 633. 平方数之和
  14. SignalR 循序渐进
  15. 腾讯QQ会员中心g_tk32算法【C#版】
  16. AtoZ CSS快速提示:对文本使用OpenType
  17. adb操作提示Read-only file system问题
  18. PHP+SQL考勤系统安全性的设计与实现
  19. tm1688_TM1668驱动LED 子程序
  20. 真正深爱一个人,永远睡不够

热门文章

  1. Python每日一记60这一仗,华为必须赢,一定能赢!
  2. Linux 操作系统原理 — Traffic Control 流量控制与 IP QoS 技术解析
  3. 《韭菜的自我修养》读书笔记
  4. 从零搭建生产Hadoop集群(五)——CDH集群修改主机名与IP
  5. mongodb aggregate中,使用$unwind对数组中的字典对象求和
  6. 带有哨兵的顺序表查找和二分法查找(折半查找)(java)代码+说明
  7. 艺术与云的创新融合: 亚马逊云科技助力英伦超豪华跑车品牌转身新能源
  8. 计算机专业的技能测试,计算机类基本能力测试
  9. 【辐射4】用Mod Organizer载入mod时CBBE身形无效的情况(身体贴图错误、黑块等等)(做个记录)
  10. 万圣节(halloween)