【JZOJ4726】种花 题解(贪心+堆)
2024-10-09 11:39:41
题目大意:在一个长度为$n$的环型序列中取出$m$个数使这$m$个数的和最大,且要求这$m$个数互不相邻。
----------------------
考虑维护$nxt$和$lst$,即一个数的前驱和后继。如果此数被选中,那么$a[now]=a[lst]+a[nxt]-a[now]$并且更新前驱和后继,再将更新过后的数扔入堆中。
即反悔机制。
操作$m$次后输出$ans$即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+;
int n,m,a[maxn],nxt[maxn],lst[maxn],ans,mov[maxn];
struct node{int k;};
bool operator < (node x,node y) {return a[x.k]<a[y.k];};
priority_queue<node> q;
int main()
{
scanf("%d%d",&n,&m);
if (n<m*)
{
printf("Error!");
return ;
}
for (int i=;i<=n;i++) scanf("%d",&a[i]),q.push((node){i});
for (int i=;i<n;i++) nxt[i]=i+;nxt[n]=;
for (int i=;i<=n;i++) lst[i]=i-;lst[]=n;
while(m--)
{
node now=q.top();q.pop();
while(mov[now.k])
{
now=q.top();
q.pop();
}
ans+=a[now.k];
a[now.k]=a[lst[now.k]]+a[nxt[now.k]]-a[now.k];
mov[lst[now.k]]=;
mov[nxt[now.k]]=;
lst[now.k]=lst[lst[now.k]],nxt[lst[now.k]]=now.k;
nxt[now.k]=nxt[nxt[now.k]],lst[nxt[now.k]]=now.k;
q.push((node){now.k});
}
printf("%d",ans);
return ;
}
最新文章
- 知乎大牛的关于JS解答
- python 二进制读写文件
- C# SortedList类概念和示例
- java网络---再论URL &; URI
- github与eclipse创建仓库及克隆仓库
- JavaScriptSerializer中日期序列化问题解决方案
- 字符编码GB2312、GBK、UTF-8的区别
- Python之 for循环\while循环
- Xml语言
- JAVA笔记1-00
- Linq to Sql 左连接查询
- RandomAccessFile多线程下载、复制文件、超大文件读写
- 需求分析---NABCD
- sql sever insert into混合嵌套插入
- 大规模使用 Apache Kafka 的20个最佳实践
- 关于Windows系统不会变慢的设想
- Grok patterns 汇总
- shell中括号的特殊用法 linux if多条件判断
- itcast-spring
- svn cleanup
热门文章
- [JAVA]使用字节流拷贝文件
- input函数报错";*** is not defined";
- scala 数据结构(十一):流 Stream、视图 View、线程安全的集合、并行集合
- 数据可视化之powerBI技巧(八)Power BI按多列排序的技巧
- bzoj3858Number Transformation*
- Oracle基础概述
- js:数组(创建、遍历、函数)
- Intelij DataGrip 的安装和使用
- vector基本用法
- 附002.Nginx代理相关模块解析