bzoj 2151: 种树 贪心+优先队列
题意
有围成一圈的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: 种树 贪心+优先队列相关推荐
- BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2151 是 hydro 的 BZOJ ...
- HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...
- BZOJ 3119 Book (贪心+数学推导)
BZOJ 3119 Book (贪心+数学推导) 手动博客搬家: 本文发表于20191029 22:49:41, 原地址https://blog.csdn.net/suncongbo/article/ ...
- 1163 最高的奖励(贪心+优先队列)
有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成该任务,就可以获得对应的奖励.完成每一个任务所需的时间都是1个单位时间.有时候完成所有任务是不可能的,因为时间上可能会有冲突 ...
- 贪心+优先队列 HDOJ 5360 Hiking
题目传送门 1 /* 2 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 3 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小, ...
- 贪心(优先队列) - New Year Snowmen - CodeForces - 140C
贪心(优先队列) - New Year Snowmen - CodeForces - 140C 题意: 给定一个长度为n的正整数序列a1,a2,...,an.给定一个长度为n的正整数序列a_1,a_2 ...
- CodeForces 140C New Year Snowmen (贪心+优先队列)
题意:n个数,选三个严格下降的数为一组,求最多能选多少组,并列出每组哪些数. 题解:贪心+优先队列 最多能选多少组,那么必须贪心数量多的. 例如:1 1 2 3 4 5 如果按照数的大小排序,只能贪到 ...
- CF140C New Year Snowmen(贪心+优先队列)
CF140C 贪心+优先队列 贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成 雪球数用优先队列维护 #include <bits/ ...
- 【BHOJ 女娲加农炮 |、||】贪心 | 优先队列 | 堆 | E
这次我们通过两道例题来总结一下优先队列的用法和实现: 目录: [BHOJ 1512]女娲加农炮 [BHOJ 1517]女娲加农炮II [BHOJ 1512]女娲加农炮 核心:贪心 + 优先队列 URL ...
最新文章
- 照片墙瀑布流加载与阻止加载
- Go to sleep
- 表的字段中的值需要替换怎么办?【if 函数,case when函数,中间表思路】
- linux一步一脚印---more、less、head、tail
- list.php tid= field,dedecms列表页模板中调用当前栏目文章数
- Android开发笔记(一百五十八)运行时动态授权管理
- DataSetProvider的Option属性
- go home(2)-supprise
- ubuntu安装java虚拟机
- 微信支付基于图计算的反欺诈实践
- c语言线性链表的插入,线性链表的创建_插入_删除_操作_C语言
- 软件设计师考试真题链接
- C++ 167. 两数之和 II 633. 平方数之和
- SignalR 循序渐进
- 腾讯QQ会员中心g_tk32算法【C#版】
- AtoZ CSS快速提示:对文本使用OpenType
- adb操作提示Read-only file system问题
- PHP+SQL考勤系统安全性的设计与实现
- tm1688_TM1668驱动LED 子程序
- 真正深爱一个人,永远睡不够
热门文章
- Python每日一记60这一仗,华为必须赢,一定能赢!
- Linux 操作系统原理 — Traffic Control 流量控制与 IP QoS 技术解析
- 《韭菜的自我修养》读书笔记
- 从零搭建生产Hadoop集群(五)——CDH集群修改主机名与IP
- mongodb aggregate中,使用$unwind对数组中的字典对象求和
- 带有哨兵的顺序表查找和二分法查找(折半查找)(java)代码+说明
- 艺术与云的创新融合: 亚马逊云科技助力英伦超豪华跑车品牌转身新能源
- 计算机专业的技能测试,计算机类基本能力测试
- 【辐射4】用Mod Organizer载入mod时CBBE身形无效的情况(身体贴图错误、黑块等等)(做个记录)
- 万圣节(halloween)