题意

\(N\)个数,至多选\(k\)个,相邻两数不能同时选,问最大价值。

思路

一种假的思路:直接扔进对里面,每次都选最大的可以选的,再把两边和自己标记为不能选,一直贪心下去。是不是很有道理?

假在哪里?虽然这个是最大的,旁边两个加起来比它大,就错了。

把这个假贪心改一改,赐予它一个反悔的机会。如果它不选\(i\),那么它可以选则\(last[i]\)和\(next[i]\),这两个一定是一起选的(因为在一起才有超过\(i\)的可能)。此时它的价值为\(a[last[i]]+a[next[i]]\),原先已经选了\(a[i]\),所以就再扔一个\(a[last[i]]+a[next[i]]-a[i]\) 进去取代原来的数。由于这样选了\(2\)个数,而选一次反悔一次也恰好用掉\(2\)次机会,所以正好。

置于维护\(last、next\)只要用双向链表就好了

#include <bits/stdc++.h>
using namespace std;
pair<int,int> t;
const int N=500005;
int n,k,a[N],f[N],last[N],Next[N];
long long ans;
priority_queue <pair<int,int>> q;
int main(){
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
q.push(make_pair(a[i],i));
}
for (int i=1;i<=n;i++) last[i]=i-1,Next[i]=i+1;
last[n+1]=n,Next[0]=1;
for (int i=1;i<=k;i++){
t=q.top();
while (f[t.second]) q.pop(),t=q.top();
q.pop();
if (t.first<0) break;
ans+=t.first;
int id=t.second;
f[last[id]]=f[Next[id]]=1;
a[id]=a[last[id]]+a[Next[id]]-a[id];
q.push(make_pair(a[id],id));
last[id]=last[last[id]],Next[id]=Next[Next[id]];
Next[last[id]]=id,last[Next[id]]=id;
}
printf("%lld",ans);
}

LG1484 种树的更多相关文章

  1. [Data Structure] 数据结构中各种树

    数据结构中有很多树的结构,其中包括二叉树.二叉搜索树.2-3树.红黑树等等.本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂. 1. 二叉树 二叉树是数据结构中一种重要 ...

  2. 种树 (codevs 1653) 题解

    [问题描述] 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号为1..n.每个块大小为一个单位尺寸并最多可种一棵树.每个居民想在门前种些树并指定了三个号码b,e ...

  3. 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树

    另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...

  4. [swustoj 183] 种树

    种树(0183) 问题描述 Aconly有一块矩形的地,因为这块地里有很多石头,耕作很不方便,所以他打算在这块地上种一些果树.这块地用一个只含‘#’和‘*’的N*M的矩阵来表示,‘#’表示泥土,‘*’ ...

  5. bzoj2151 种树 双向链表+堆

    2151: 种树 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1151  Solved: 613[Submit][Status][Discuss] ...

  6. 【bzoj2151】种树

    Time Limit: 1000ms                     Memory Limit: 128MB Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府 ...

  7. BZOJ_2151_种树_贪心+堆+链表

    BZOJ_2151_种树_贪心+堆 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编 ...

  8. P1250 种树

    P1250 种树 题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定 ...

  9. luogu P1250 种树

    我来总结一下最常用的两种办法 1.贪心 2.差分约束 那么我们先来讲,贪心版<种树> 大家可能知道有一个题和这个类似,那个是钉钉子而这个是种树 我们可以借用钉钉子的思路来想,首先这个是让你 ...

随机推荐

  1. Docker安装MySQL数据库

    本文翻译自:MySQL Docker Containers:Understanding the basics 1.下载MySQL镜像 docker pull mysql:5.6 如此便可以下载最新的M ...

  2. 【原创】大数据基础之Drill(2)Drill1.14+Hive2.1.1运行

    问题 Drill最新版本是1.14,从1.13开始Drill支持hive的版本升级到2.3.2,详见1.13的release notes The Hive client for Drill is up ...

  3. HttpClient当HTTP连接的时候出现大量CLOSE_WAIT连接(转)

    ESTABLISHED 表示正在进行网络连接的数量 TIME_WAIT 表示表示等待系统主动关闭网络连接的数量 CLOSE_WAIT 表示被动等待程序关闭的网络连接数量 上篇文章给出了解决TIME_W ...

  4. type=file的inpu美化,自定义上传按钮样式

    <div class="div1"> <div class="div2">点击上传</div> <input type ...

  5. PHP实现微信开发中提现功能(企业付款到用户零钱)

    一.实现该功能目的 这几天在小程序里要实现用户从系统中提现到零钱的功能,查了一下文档可以使用 企业付款到用户零钱 来实现: 官方文档:https://pay.weixin.qq.com/wiki/do ...

  6. xilinx和altera的fpga的不同之处!----如果不知道,你将为之付出代价! --转载

    本人从2004年接触fpga开始,至今已经8年了.开发过altera的flex系列和cyclone3系列:开发过xilinx的vii和v5系列.下面谈谈本人对二者的一些不同,以便引起开发者对一些细节上 ...

  7. Javascript我学之二函数定义

    本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘 函数 几个要点:                 a).函数是javascript中的一等公民 (重要性)                 b ...

  8. String hashcode的兴趣试玩

    今天突然看到Hashcode和equals,==比较时,一时兴起,想了解一下hashcode生成规则,为什么hashcode相同,无法说明对象相等,但用equals说明相同,却可以推出对象的hashc ...

  9. 【Linux】使用Nginx发布dotnet的网站

    1.安装Nginx[自行百度] 2.安装dotnet运行时[自行百度] 3.配置Nginx——  /etc/nginx/conf.d/default.conf server { listen ; se ...

  10. python3类方法与静态方法

    静态⽅法和类⽅法 转载于:https://blog.csdn.net/qq_41020281/article/details/79634707 1. 类⽅法 是类对象所拥有的⽅法,需要⽤修饰器 @cl ...