LG1484 种树
题意
\(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 种树的更多相关文章
- [Data Structure] 数据结构中各种树
数据结构中有很多树的结构,其中包括二叉树.二叉搜索树.2-3树.红黑树等等.本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂. 1. 二叉树 二叉树是数据结构中一种重要 ...
- 种树 (codevs 1653) 题解
[问题描述] 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号为1..n.每个块大小为一个单位尺寸并最多可种一棵树.每个居民想在门前种些树并指定了三个号码b,e ...
- 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树
另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...
- [swustoj 183] 种树
种树(0183) 问题描述 Aconly有一块矩形的地,因为这块地里有很多石头,耕作很不方便,所以他打算在这块地上种一些果树.这块地用一个只含‘#’和‘*’的N*M的矩阵来表示,‘#’表示泥土,‘*’ ...
- bzoj2151 种树 双向链表+堆
2151: 种树 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1151 Solved: 613[Submit][Status][Discuss] ...
- 【bzoj2151】种树
Time Limit: 1000ms Memory Limit: 128MB Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府 ...
- BZOJ_2151_种树_贪心+堆+链表
BZOJ_2151_种树_贪心+堆 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编 ...
- P1250 种树
P1250 种树 题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定 ...
- luogu P1250 种树
我来总结一下最常用的两种办法 1.贪心 2.差分约束 那么我们先来讲,贪心版<种树> 大家可能知道有一个题和这个类似,那个是钉钉子而这个是种树 我们可以借用钉钉子的思路来想,首先这个是让你 ...
随机推荐
- selenium——键盘操作
很多键盘操作实际是没有意义的.
- 【原创】大数据基础之Spark(8)Spark中Join实现原理
spark中join有两种,一种是RDD的join,一种是sql中的join,分别来看: 1 RDD join org.apache.spark.rdd.PairRDDFunctions /** * ...
- 【原创】大叔经验分享(46)用户提交任务到yarn报错
用户提交任务到yarn时有可能遇到下面的错误: 1) Requested user anything is not whitelisted and has id 980,which is below ...
- Mysql 常用SQL语句集锦
基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day from table_name" ...
- SSH总结
远程服务介绍说明 SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输.确保了数据传输安全.那SSH服务主要功能有哪些呢?1.提供远程连接服务器的服务2.对传输的数据进 ...
- Python的单例模式
一.何为单例模式 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某个类只有一个实例的途径: 1.让一个全局变量使得一个对象被访问,但是他不能防止外部实例化多个对象. 2.让类自 ...
- Web Application Vulnerablities
1. File inclusion berfoe start this caption i make a conclusion for install third-part as follow I ...
- Intellij Idea 2016创建web项目
一.创建简单web项目 1.创建一个web project File -> new Project ->选择project sdk 为1.8(已经配过环境变量)其他不要选 -> Ne ...
- 必须了解的Object知识
必须了解的Object知识 作为Java中所有类的根类,Object提供了很多基础的方法,我们经常会覆写它的方法,但很多时候因为不了解这些方法内在的含义以及与其他方法之间的关系而错误的覆写.下面介绍一 ...
- day12.生成器;wraps初识
生成器 在 Python 中,使用了 yield 的函数被称为生成器(generator). 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器. 在 ...