[bzoj2151][贪心]种树

贪心算法训练(五)——种树(区间选点问题) 1. 问题描述  一条街道的一边有几座房子,因为环保原因居民想要在路边种些树,路边的地区被分割成 n 块,并被编号为 1…n,每块大小为一个单位尺寸并最多可以种一棵树,每个居民想在门前种些树并指定了三个数 b,e,t 这三个数分别表示该居民想在 b 和 e 之间最少种 t 棵树,当然,b 阅读详情

Description

A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置。值得注意的是1号和n号也算相邻位置!)。最终市政府给园林部门提供了m棵树苗并要求全部种上,请你帮忙设计种树方案使得美观度总和最大。如果无法将m棵树苗全部种上,给出无解信息。

Input

输入的第一行包含两个正整数n、m。第二行n个整数Ai。

Output

输出一个整数,表示最佳植树方案可以得到的美观度。如果无解输出“Error!”,不包含引号。

Sample Input

【样例输入1】

7 3

1 2 3 4 5 6 7

【样例输入2】

7 4

1 2 3 4 5 6 7

Sample Output

【样例输出1】

15

【样例输出2】

Error!

HINT

【数据规模】

对于全部数据:m<=n;

-1000<=Ai<=1000

N的大小对于不同数据有所不同:

数据编号 N的大小 数据编号 N的大小

1 30 11 200

2 35 12 2007

3 40 13 2008

4 45 14 2009

5 50 15 2010

6 55 16 2011

7 60 17 2012

8 65 18 199999

9 200 19 199999

10 200 20 200000

题解

相似与bzoj1150,只不过这道题算是那道题的弱化版。。
因为给出的序列无需考虑边界问题2333
老做法,堆维护队列。记录一下这个点的权以及位置
当取出一个点的时候,加入一个新点进堆。新点的权为他左边那个点的权+右边那个点的权-取出点的权。如果取旁边两个比取当前这个更优的话,那么下一次就会取到新加入那个点了,同时维护了贪心。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
struct node
{
    int c,u;
    friend bool operator <(node n1,node n2){return n1.c<n2.c;}
};//值 位置 
priority_queue<node> q;
int n,m,col[210000],pre[210000],nxt[210000],del[210000];
int sum[210000];
int main()
{
    memset(del,0,sizeof(del));
    scanf("%d%d",&n,&m);
    if(n<m*2){printf("Error!\n");return 0;}
    for(int i=1;i<=n;i++)scanf("%d",&col[i]),pre[i]=i-1,nxt[i]=i+1,sum[i]=col[i];
    pre[1]=n;nxt[n]=1;
    for(int i=1;i<=n;i++)
    {
        node tmp;
        tmp.c=col[i];tmp.u=i;
        q.push(tmp);
        //printf("%d\n",q.top().c);
    }
    int ans=0;
    for(int i=1;i<=m;i++)
    {
        node tmp=q.top();
        while(del[tmp.u]!=0)q.pop(),tmp=q.top();
        ans+=tmp.c;q.pop();
        int l=pre[tmp.u],r=nxt[tmp.u],cnt=0;
        //把前后一条删掉,加入最大值为suml+sumr-sumu的线段,位置为tmp.u 
        del[l]=1;cnt+=sum[l];
        pre[tmp.u]=pre[l];nxt[pre[l]]=tmp.u;
        del[r]=1;cnt+=sum[r];
        nxt[tmp.u]=nxt[r];pre[nxt[r]]=tmp.u;
        node P;
        P.u=tmp.u;P.c=cnt-tmp.c;del[tmp.u]=0;
        sum[P.u]=P.c;
        q.push(P);
    }
    printf("%d\n",ans);
    return 0;
}
BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐 【BZOJ修复计划 #16】BZOJ 2151 种树【国家集训队2011】 阅读详情

相关推荐

max超级种树插件

ch——FOREST_PACK.PRO_4.0.2.352X64max 插件 种植树木,场景环境美化,等

Leetcode605. 种花问题

Leetcode605. 种花问题

ProgramNovice的博客 796

3dmax插件神器-019-全模种树.mse

3dmax插件神器-019-全模种树.mse

3DMAX森林树木植物插件ForestPackLite教程

3DMAX森林树木植物插件ForestPackLite教程

沐风老师 5018

【openEuler容器镜像部署指南】

【代码】【List集合排序 】

weixin_43878094的博客 1111

有源滤波电路设计

目录一、低通滤波器1、同相输入低通滤波器(1)一阶低通滤波电路(2)二阶低通滤波电路(压控电压源;Sallen-Key)2、反相输入低通滤波器(1)一阶低通滤波电路(2)二阶低通滤波电路(无限增益多路反馈)二、高通滤波器1、同相输入高通滤波器(1)一阶高通滤波电路(2)二阶高通滤波电路(压控电压源;Sallen-Key)2、反相输入高通滤波电路(1)二阶高通滤波电路(无限增益多路反馈) 一、低通滤波器 1、同相输入低通滤波器 (1)一阶低通滤波电路 即在一阶无源低通滤波器的基础上,加了一个集成运放。 它的

qq_41873236的博客 3万+

【BZOJ2151】种树(贪心)

【BZOJ2151】种树(贪心) 题面 BZOJ 题解 如果没有相邻不能选的限制,那么这就是一道傻逼题。 只需要用一个堆维护一下就好了。 现在加上了相邻点的限制,那么我们就对于当前位置加入一个撤销操作。 怎么撤销呢? 如果我们选择了一个点,那么我们就把他前后两个位置删去, 然后将当前点合并为\(a[last]+a[next]-a[now]\)的权值。 如果下次选择了这个位置的话,就可以认为撤销了选...

weixin_30553065的博客 84

CorelDRAW 2019安装指南:从下载到激活的完整步骤

本文提供了一份详细的CorelDRAW 2019安装指南,涵盖从下载安装包、检查系统环境到完成激活的完整步骤。文章重点解析了安装过程中的关键选项设置,并分享了首次启动后的优化配置与常见问题解决方案,旨在帮助用户高效、顺利地完成这款经典矢量设计软件的安装与配置。

weixin_29213827的博客 833

BZOJ 2151 种树 贪心

2151: 种树 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 711  Solved: 396[Submit][Status][Discuss]A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得

Loi_Vampire的博客 1182

Virbox Protector:全方位守护 Android 应用安全

在数字化浪潮中,Android 应用面临着诸多安全挑战,如破解、篡改、盗版、数据窃取和钓鱼欺诈等。为了应对这些复杂的安全问题,Virbox Protector 应运而生,为 Android 应用提供高强度的专业化安全保护,支持对 APK 和 AAB 文件的加固保护,并兼容 Google Play,助力应用顺利出海。

VBP_2025的博客 996

信息安全与技术——(十一)恶意代码检测与防范技术

恶意代码(Malicious Code )或恶意软件(Malware )主要是指以危害信息的安全等不良意图为目的的程序,它们一般潜伏在受害计算机系统中实施破坏或窃取信息。

m0_63853448的博客 5991

bzoj 2151 种树 贪心+堆

题面 题目传送门 解法 堆用来撤销之前操作的经典应用 显然可以选择dp,但是复杂度好像不太对,应该是O(nm)O(nm)O(nm)的 一个比较显然的贪心是,每一次选择最大的那一个,然后一直这样取下去 很明显, 这个贪心是错误的:19 20 19 1 按照上面的贪心策略,我们会先选择20,然后再选择1。显然,这个方案没有19+19优 所以,我们现在要考虑如何“撤销”之前错误的选择方案 ...

mysterynoip的博客 285

cosi-corr操作详细步骤

cosi-corr是一个可以加载到ENVI的软件包,由加利福尼亚理工学院的François Ayoub,  Sébastien Leprince,  and Lionel Keene开发,并且提供源代码,该软件受到了NSF的资助。软件的主要功能是可以满足各种影响的正射校正和影像配准。 针对下载下来的软件包参考《cosi-corr_guide.pdf》,进行配置使用具体详细过程如下: (本机环境

u013299471的专栏 1万+

[BZOJ2151] 种树 贪心

2151: 种树 Time Limit:10 SecMemory Limit:259 MBSubmit:1151Solved:613[Submit][Status][Discuss] Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置...

weixin_30502157的博客 102

北斗导航 | ChatGPT之RTK、RTD、ARAIM算法原理及程序代码(ChatGPT看你怎么回答,附部分代码)

ChatGPT之RTK、RTD、ARAIM算法原理及程序代码

尘世冰封的专栏 3678

海思图像质量之HiPQTool调试

文章目录一. HiPQTool 界面二. 图像调试三. 将调试参数写入程序中 一. HiPQTool 界面 二. 图像调试 三. 将调试参数写入程序中

lzg2011的博客 2378

bzoj 2151 种树——贪心+后悔

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2151 似乎是半年+前讲过的。(然而看到的时候却不会了) 考虑贪心,限制就是不能选两边的。如果选了最大的又要反悔,一定不可能是要只选旁边的一个,而是把两个都选了; 所以选了这个以后,把两边的打上标记表示不能选,往堆里加入一个值为 两边的值-自己的值 的元素表示反悔选择即可。 维护两边是...

weixin_33806914的博客 161

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【BZOJ 2151】 2151: 种树 (贪心+堆+双向链表)

2151: 种树 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置。值得注意的是1号和n号...

weixin_30687587的博客 84

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【BZOJ2151】种树(堆,贪心)

Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置。值得注意的是1号和n号也算相邻位置!)。最终市政府给园林部门提供...

დ♂Hany01's Blog Space♂ღ 349

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

bzoj 2151 种树(贪心+堆)(经典)

思路: 看到题,第一反应就是搜索,学了一年,还太水。。看了大神的博客。如下: 分析: 首先考虑如果没有“相邻位置不能都种”这一限制会怎么样。这时就是一个裸的贪心——按照A[i]从大到小排序,然后取前M个。 那么加上限制以后会发生什么呢?

sunny crazy 3059

【bzoj2151】【种树】【堆+贪心】

DescriptionA城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置。值得注意的是1号和n号也算相邻位置!)。最终市政府给园林部门提供了m棵

sunshinezff的专栏 1777

[bzoj 2151]种树(贪心)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 分析:原型是bzoj 1150(CTSC 2007) 首先DP无法下手,想到贪心。想到贪心的第一感觉就是从大的开始取,但明显有反例,最烦的就是一个大的旁边旁边两个也很大,导致如果取了那两个最后结果更大。解决的办法就是每次取最大的同时,把它同旁边两个点合并成一个点,权值取:左+右-中间...

weixin_30614109的博客 114

BZOJ2151 种树 [贪心+链表]

Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。 园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置。值得注意的是1号和n号也算相邻位置!)。 最终市政府给园林部门提...

weixin_34358365的博客 157

洛谷1484 BZOJ2151 种树 贪心+堆

题目链接 洛谷题意: 给你一个长度为n的序列,每个位置有一个权值,相邻位置不能同时被选,问你选k个数得到的最大权值是多少(可以选的数不足k个)。 BZOJ题意:把洛谷的序列改成环,并且要判断无解情况,但是必须选足k个数。 题目差不多。 这是一个比较经典的题目,这题不难想出可以n^2dp,但是好像没法优化。我们考虑贪心,记录每个点左侧和右侧的点是哪个点,然后记录每个点的点权和每个点是否被考...

forever_shi的博客 298
上一篇: [bzoj2140][强联通]稳定婚姻
下一篇: [bzoj2875][矩阵乘法]随机数生成器
Rose_max
博客等级 码龄10年 97粉丝 610原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值