贪心 park
来总结一道非常经典的好题

这一道题是通过贪心实现的
首先看到这一题的时间复杂度
n<=100000
需要一个比较玄学的做法
我们先假设把题干改成这个样子
一圈n个车位
停在每个车位都有一定的代价
停m个车 可以相邻 求最小代价
那么这就是非常简单的贪心
可以每一次都取当前最小的车位来停
那么这个题只不过是增加了一个不能两两相邻的限制条件
我们可以想办法变成上一个题
如果我们有一个环是这样的
x
y z
a
这四个数中最小的数是x
然而y+z<x+a
如果我们用普通的贪心肯定是先取到最小的x
那么这一道题得出的就不是正确答案
我们假如要删掉x 选y和z 需要怎么处理呢?
我们可以添加一个值y+z-x点
如果将这个点加到答案里面 就相当于对x进行了删除操作 并且选上了y和z
注:我们还要证明一下为什么去掉x后 如果选y就一定也要选z
y x z
如果我们之前选过了x(最小) 现在有更优的解需要删掉x
假如我们只选了y
没有选z
那么这是不成立的
因为如果只选了y 完全可以把y替换成x从而得出一个更小更优的答案
所以如果选了y
就一定也会选z
这一道题的实现方法 就是维护一个优先队列
我们先把所有的点入队
这样子就队列内部就自动维护从小到大排序了(堆实现的)
我们每一次取出最前的一个点(当前最小)
累加到ans上 并把当前点删除 把两边合并
也就是

再把当前点的值变为左+右-自己 就是刚才说的
作为一个新的点加入到优先队列里去
如此一来 既维护了答案最小 也维护了点两两不相邻
这是比较经典且有难度的一个题型 要好好掌握!
#include<bits/stdc++.h>
#define N 200010
#define pa pair<int,int>
using namespace std;
int n,m,a[N];
int L[N],R[N];
bool vis[N];
void del(int x)
{
vis[x]=;
R[L[x]]=R[x];
L[R[x]]=L[x];
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
priority_queue<pa,vector<pa>,greater<pa> >q;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(i==)
L[i]=n;
else
L[i]=i-;
if(i==n) R[i]=;
else R[i]=i+;
q.push(pa(a[i],i));//优先队列
}
int ans=;
while(m--){
while(vis[q.top().second])
q.pop();
int x=q.top().second;
q.pop();
ans+=a[x];
a[x]=a[L[x]]+a[R[x]]-a[x];
del(L[x]);del(R[x]);
q.push(pa(a[x],x));
}
cout<<ans; return ;
}
贪心 park的更多相关文章
- 【AT2434】JOI 公園 (JOI Park) 最短路+贪心
题解 我的歪解 我首先想的是分治,我想二分肯定不行,因为它是没有单调性的. 我想了一下感觉它的大部分数据应该是有凸性的(例如\(y=x^2\)的函数图像),所以可以三分. 下面是我的三分代码(骗了不少 ...
- Uva11292--------------(The Dragon of Loowater)勇者斗恶龙 (排序后贪心)
---恢复内容开始--- 题目: Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major ...
- [ACM_水题] UVA 11292 Dragon of Loowater [勇士斗恶龙 双数组排序 贪心]
Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shor ...
- uva11292贪心基础题目
C - 贪心 基础 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:65536KB 64bi ...
- L贪心基础
<span style="color:#330099;">/* L - 贪心 基础 Time Limit:1000MS Memory Limit:65536KB 64b ...
- UVA 11292 Dragon of Loowater(简单贪心)
Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...
- POJ 3154 Graveyard【多解,数论,贪心】
Graveyard Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1707 Accepted: 860 Specia ...
- Gym - 101670B Pond Cascade(CTU Open Contest 2017 贪心,二分)
题目: The cascade of water slides has been installed in the park recently and it has to be tested. The ...
- UVA 11292-Dragon of Loowater (贪心)
Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shor ...
随机推荐
- H3C PPP会话建立过程
- webpack学习(五)entry和output的基础配置
1:entry和output就是打包的入口和出口的两个对象.但是如果入口文件就一个的话(应该说只希望打包出一个脚本文件), entry直接跟一个字符串(入口文件路径)就可以了.如:entry : &q ...
- 在Vue 中调用数据出现属性不存在的问题
这已经是我在调用数据时趟过几次的坑了,索性记录下来防止后面再犯: 一般我们请求数据来渲染一个页面的时候,请求下来的数据基本上都是数组或是对象,再通过列表循环和插值表达式渲染的页面:在data 中提前声 ...
- JPA查询之Specification以及HQL、SQL查询
1.Specification //查询条件List List<Predicate> predicateList = new ArrayList<Predicate>(); S ...
- C# 如何写出一个不能被其他程序集继承的抽象类
我需要限定某个抽象类只能在我程序集类实现,而不支持其他程序集实现,也就是我需要一个不能被继承的抽象类 在 C# 里面有抽象类和接口,这两个都是期望被继承才能被使用,而抽象类是可以做到只能在自己程序集和 ...
- 【t066】致命的珠宝
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 门上有着N个宝珠,每个宝珠都有一个数字.Mini询问老者后,得知要想打开这扇门,就得找出两颗珠宝,使这 ...
- javascript修改css样式表
//创建var sheet=document.createElement('style');document.bodt.appendChild(sheet);sheet.styleSheet.cssT ...
- anaconda在本地安装软件conda install
安装完anaconda后,想在mac下安装pytorch,但是在用官网提供的安装方法一直安装不上pytorch和torchvision,估计是被墙了 conda install pytorch tor ...
- 复盘:错误理解zuul路径匹配,无法使用zuul
场景: 项目中用到zuul时,配置url总是有问题,无法路由到对应微服务. 配置如下: zuul: routes: m2-member: path: /member/* serviceId: m2-m ...
- [译] 重新思考 1 号进程 / Rethinking PID 1
By Lennart Poettering 译 SReadFox 原文链接:http://0pointer.de/blog/projects/systemd.html 译注:笔者大约在 2011 年读 ...