贪心 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 ...
随机推荐
- P1099 双连击
题目描述 我们假设一个二位整数 \(N(10 \le N \le 99)\) ,它的十位上的数字是 \(A\) ,个位上的数字是 \(B\) ,如果 \(A\) 和 \(B\) 的比例关系满足 \(A ...
- UVa 11134 - Fabled Rooks——[问题分解、贪心法]
We would like to place n rooks, ≤ n ≤ , on a n × n board subject to the following restrictions • The ...
- C# 从零开始写 SharpDx 应用 笔刷
本文告诉大家如何在 SharpDx 里面使用笔刷,包括纯色笔刷.渐变笔刷和图片笔刷 本文属于 SharpDx 系列 博客,建议从头开始读 初始化 本文将会在 C# 从零开始写 SharpDx 应用 初 ...
- IDEA开发 工具IC和IU的区别
现在很多人都在用IDEA开发工具,那么下载安装时会有ideaIU和ideaIC两个版本,到底该怎么选择呢? 首先: ideaIU:U代表的是Ultimate,这个是官方旗舰版也就是商用版本,官方只提供 ...
- RabbitMQ-Exchange交换器
交换器分类 RabbitMQ的Exchange(交换器)分为四类: direct(默认) headers fanout topic 其中headers交换器允许你匹配AMQP消息的header而非路由 ...
- 一点资讯 视频抓取 phantomjs
# _*_ coding: utf- _*_ """ 思路: .列表页使用phantomjs模拟点击.每个链接只抓取第一页9-10条内容,按照标题去重 .布置定时任务,每 ...
- C语言中的符号总结
1.注释符号 //和/* ...*/ 2.续行符号 \ 3.转义符号 常用:\ ...
- hibernate_检索策略
一.概述 检索策略分三大块,类级别检索策略和关联级别检测策略. 类级别检索策略:get.load. 关联级别检索策略:order.getCustomer().getName() 上面这两种应该是看得懂 ...
- requests爬取豆瓣top250电影信息
''' 1.爬取豆瓣top250电影信息 - 第一页: https://movie.douban.com/top250?start=0&filter= - 第二页: https://movie ...
- DEVOPS技术实践_14:使用docker部署jenkins
一 基础环境准备 [root@node6 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@node6 ~]# yum -y ...