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

这一道题是通过贪心实现的

首先看到这一题的时间复杂度

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的更多相关文章

  1. 【AT2434】JOI 公園 (JOI Park) 最短路+贪心

    题解 我的歪解 我首先想的是分治,我想二分肯定不行,因为它是没有单调性的. 我想了一下感觉它的大部分数据应该是有凸性的(例如\(y=x^2\)的函数图像),所以可以三分. 下面是我的三分代码(骗了不少 ...

  2. Uva11292--------------(The Dragon of Loowater)勇者斗恶龙 (排序后贪心)

    ---恢复内容开始--- 题目: Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major ...

  3. [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 ...

  4. uva11292贪心基础题目

    C - 贪心 基础 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bi ...

  5. L贪心基础

    <span style="color:#330099;">/* L - 贪心 基础 Time Limit:1000MS Memory Limit:65536KB 64b ...

  6. UVA 11292 Dragon of Loowater(简单贪心)

    Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...

  7. POJ 3154 Graveyard【多解,数论,贪心】

    Graveyard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1707   Accepted: 860   Specia ...

  8. 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 ...

  9. UVA 11292-Dragon of Loowater (贪心)

    Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shor ...

随机推荐

  1. [转]如何让多个不同类型的后端网站用一个nginx进行反向代理实际场景分析

    前段时间公司根据要求需要将聚石塔上服务器从杭州整体迁移到张家口,刚好趁这次机会将这些乱七八糟的服务器做一次梳理和整合,断断续续一个月迁移完 成大概优化掉了1/3的机器,完成之后遇到了一些问题,比如曾今 ...

  2. [C++] 烦人的error LNK2019和error LNK2001

    常见原因: 没有正确的设置引用的lib,新手常犯这个错误,这是最容易解决的问题. extern "C"的问题.如果C++写的dll要给C程序用,那么就要注意extern " ...

  3. ipv6现状,加英文的中括号访问, ipv6测试http://test-ipv6.com

    加英文的中括号就可以,如[2001:4998:c:e33::1004],我发现这是yahoo首页.但并不是所有IPv6网站都可以通过IPv6地址访问,跟IPv4一样,网站服务器端可以只绑定域名,不接受 ...

  4. 51nod 1307绳子和重物

    1307 绳子与重物  题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有N条绳子编号 0 至 N - 1,每条绳子后 ...

  5. javascript基础的一些总结

    一 闭包 各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂.我的理解是,闭包就是能够读取其他函数内部变量的函数. 由于在Javascript语言中,只有函数内部的子 ...

  6. vue-learning:2 - template - directive

    指令 directive 在上一节我们知道,VUE的template模板通过VUE指令API实现与页面的视图层联系.所以本节将聚集在实现视图层交互的VUE指令系统directive的基础使用. 我们先 ...

  7. <QluOJ2018NewCode>计算几何(寄蒜几盒)

    题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Yes"(不含引号 ...

  8. OpenWrt Kernel Module Creation Howto

    OpenWrt Kernel Module Creation Howto About OpenWrt Kernel Module Compilation You are planning to com ...

  9. Lede定时重拨

    系统,计划任务,   0 4 * * * ifup wan 梅林定时重拨: #! /bin/sh #断开拨号连接 killall pppd #延时10秒 #重新拨号 pppd >& &a ...

  10. Wannafly挑战赛25 因子 [数论]

    一.题意 令 X = n!, 给定一大于1的正整数p 求一个k使得 p ^k | X 并且 p ^(k + 1) 不是X的因子 输入为两个数n, p (1e18>= n>= 10000 & ...