[国家集训队2011]种树 解题报告

BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐 【BZOJ修复计划 #16】BZOJ 2151 种树【国家集训队2011】 阅读详情
题目:

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

分析:

首先考虑如果没有“相邻位置不能都种”这一限制会怎么样。这时就是一个裸的贪心——按照A[i]从大到小排序,然后取前M个。

那么加上限制以后会发生什么呢?
[国家集训队2011]种树 <wbr>解题报告
假设A[3]最大,那我们就试图去选A[3]。选中之后首先要去掉3,并且,A[2]和A[4]也都不能选了,所以将它们删掉——

但是慢着!这可能会导致问题。假设A[3]=20,A[2]=A[4]=19,那么同时选A[2],A[4]可能比选A[3]要优!在最后的方案中可能是A[2]+A[4]而非A[3]。这种情况要怎么解决呢?

可以发现一点:由于A[3]最大,所以在最后的方案中,不可能只选A[2],A[4]中的一个。
原因很简单:假设在最优方案中选了A[2]但未选A[4],那可以简单地把A[2]换成A[3],由于未选A[4],所以这样不会产生任何矛盾,并且把A[2]换成A[3]后,总的美观度不会下降。

因此,我们先去掉2,3,4,然后加入一个新的“物品”,其权值为A[2]+A[4]-A[3],代表同时选2,4,删去3.这样,在选了3之后再选这个新物品,功效就相当于刚才所说的,把A[3]换成A[2]+A[4]。

这个新物品应该放在哪里呢?它的含义是“选2,4”,所以很容易想到,应该把它放在1,5中间。
出于方便起见,不妨在删掉2,4后直接把A[3]改成A[2]+A[4]-A[3],显然这个位置是正确的。

如此就将N个物品,需要选M个的问题转化成了在N-1个物品中选的问题。并且可以发现一个很好的性质:新的3所对应的仍然是“选中物品数+1”!(把选3换成了选2,4,即多选了一个物品)

也就是说,完全可以把新的3看做一个和1,5毫无区别的物品,现在我们只需要在1,3,5三个物品中选择M-1个!如此下去,直到选择M次,就可以得到答案。

因此描述一下算法:以A[i]为关键字建大根堆,用一个链表存放当前物品。
最初链表中元素是1~N,i的后继是i+1,前驱是i-1(当然,1的前驱是N,N的后继是1)。
执行M次操作,每一次操作都将堆顶元素k取出,ans+=A[k]。然后在链表中删除k的前驱pre和后继nxt,令A[k]=A[pre]+A[nxt]-A[k],并更新堆。

这个算法运行的很好,但你可能感觉有点虚——为什么每次选A值最大的就正确呢?
可以发现,在上面的讨论中“选3”时,我们实际上做的是声明如下事实:
在最终答案中要么选了3,要么同时选了2,4.换句话说,要么选了3,要么在此基础上选了A[2]+A[4]-A[3]。

所以我们实际上是重写了这个问题,将其变成“N-2个物品中选M-1”个的形式,如此一直化归,直到最后变成“N-2(M-1)个物品中选1个”,这时答案就是显然的。

代码:

用 YOLOv11‑Seg 做工地实例分割:从 0 起步到效果调优,真香! 这不是一篇“官方文档翻译”,而是一篇。 阅读详情

相关推荐

从BIOS到路由器:深入拆解SPI NOR Flash的硬件连接与‘芯片内执行’(XIP)奥秘

本文深入解析SPI NOR Flash的硬件连接与‘芯片内执行’(XIP)技术,从BIOS到路由器的应用场景出发,详细介绍了其架构精髓、典型连接方案、时序设计及性能优化方法。通过实际案例和参数对比,帮助开发者掌握NOR Flash在嵌入式系统中的关键作用与设计技巧,提升电路设计效率与可靠性。

weixin_30522183的博客 491

Oh My Zsh插件深度测评:这7个插件真的能提升效率吗?(含避坑与替代方案)

本文深度测评了Oh My Zsh中7个核心插件的实际效率提升效果,包括git插件、z插件等,并提供了避坑指南与替代方案。通过实测数据和个人经验,帮助开发者优化终端环境配置,提升工作效率。特别推荐zsh-autosuggestions和zsh-syntax-highlighting等高效插件,同时揭示被高估插件的性能陷阱。

weixin_30924087的博客 480

Unity详细介绍说明限制Unity帧率的方式

在Unity开发中,帧率(FPS,Frames per Second)是一个非常重要的表现标准,它直接影响了游戏运行的流畅度。在某些应用场景里,我们可能需要手动限制帧率。限制帧率可以减少电脑的CPU和GPU负载,使运行更加稳定,同时对于移动设备来说还能有效降低电量消耗。下面就详细介绍几种限制Unity中帧率的方式。

zjw1349547081的专栏 5435

BZOJ 5085(最大-经典题)

Description给你一个n×m的矩形,要你找一个子矩形,价值为左上角左下角右上角右下角这四个数的最小值,要你最大化矩形(这个矩形的行数和列数都大于1) 的价值。Input第一行两个数n,m,接下来n行每行m个数,用来描述矩形 n, m ≤ 1000Output输出一个数表示答案 Sample Input2 21 23 4 Sample Output1从大到小枚举数, 显然答案的4个点

nike0good |Oier&ACMer | 熟能生巧 570

【PyTorch版本兼容性指南】如何在不同版本中正确使用torch.nn.attention

本文详细解析了PyTorch版本兼容性问题,特别是torch.nn.attention模块在不同版本中的使用差异。针对常见的ModuleNotFoundError错误,提供了三种实用解决方案:升级PyTorch版本、使用自定义实现和源码移植方案,并分享了最佳实践建议,帮助开发者有效避免兼容性问题。

weixin_29084231的博客 472

ESP8266连接阿里云(STM32)

一、概述 之前通过串口调试助手+ESP8266已经连接上阿里云了 ESP8266连接阿里云(串口调试助手) 这次我们使用STM32+ESP8266来接入阿里云,其实本质上就是STM32和ESP8266进行串口通信,相当于使用STM32代替之前使用的串口调试助手来发送AT指令。只是发送的字符串数据可能有些细节需要注意一下。 二、保存连接的AT指令 定义几个字符串数据保存需要发送的AT指令 //注意: //末尾记得加\r\n //字符...

xyx0610的博客 4万+

BZOJ 2226: [Spoj 5971] LCMSum( 数论 )

∑lcm(i,n) = ∑ i*n/(i,n) = ∑d|n∑(x,n)=d x*n/d = ∑d|n∑(t,n/d)=1t*n = n∑d|nf(d). f(d)表示1~d中与d互质的数的和, 即f(d) = d*φ(d)/2(d>=2). 然后O(n)筛φ, 每次询问暴力算即可...最大是100w,sqrt(100w)=1000内的质数是168个, 所以复杂度是O(n + T*168),...

weixin_30758821的博客 153

国产Flash替代方案:手把手教你用XSCT烧写ZYNQ7045的BOOT.BIN(附完整命令解析)

本文详细介绍了国产Flash替代方案在ZYNQ7045上的应用,通过XSCT工具链实现BOOT.BIN的精准烧写。内容涵盖国产Flash兼容性检查、PetaLinux环境搭建、XSCT烧写全流程及故障排查,帮助开发者高效完成国产化替代,提升硬件开发效率。

weixin_33670786的博客 425

【BZOJ 2151】种树

算法标签:贪心+堆

forever_dreams的博客 420

别再死记硬背窗函数公式了!用MATLAB实战汉宁窗FIR滤波器,从频谱图看懂‘主瓣’和‘旁瓣’

本文通过MATLAB实战演示汉宁窗FIR滤波器的设计过程,帮助读者从频谱图直观理解主瓣与旁瓣的特性。文章详细对比了矩形窗与汉宁窗的频谱差异,并提供了高通滤波器设计的完整代码示例,适用于数字信号处理学习和工程应用。

weixin_30555125的博客 490

Cesium WebGL性能调优实战:从卡顿根源到流畅渲染

本文深入探讨Cesium WebGL性能调优的实战技巧,从硬件配置、框架适配到3D Tiles加载策略,全面解决卡顿问题。通过强制启用独立显卡、优化浏览器设置、避免Vue内存陷阱等实用方法,显著提升3D地图应用的流畅度。文章还分享了高级调试工具和实战避坑经验,帮助开发者实现高效渲染。

weixin_27215337的博客 419

bzoj2151: 种树(贪心+堆)

题目传送门 。 解法: 今天才学这种经典做法。。 如果选最大的然后删除两边很显然这种策略是错误的。 因为有可能两边加起来更优。 那么上面的做法是无法反悔的。。 给他一个反悔的机会。 那么就是: 假设选了i,那么删除i前后的两个点。 然后把i这个点的权值变为a[前]+a[后]-a[i]。 这样再选i的话就表示反悔了选了前后两个。 维护一下这个位置是否删除。这个位置的前一个未被...

Hanks_o的博客 864

RS485信号测量避坑指南:示波器抓包常见问题与波形分析技巧

本文详细解析了RS485信号测量中的常见问题与解决方案,包括差分信号测量基础、终端电阻配置、共模干扰处理等关键技巧。通过实测波形案例和优化建议,帮助工程师有效提升RS485通信的可靠性和抗干扰能力,适用于工业自动化、远程监测等场景。

kappa的博客 615

bzoj 2151 种树——贪心+后悔

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

weixin_33806914的博客 161

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【BZOJ2151】种树,贪心+Splay乱搞

间接砍树胡乱种"树"毫无建树

xiaoyimi的博客 730

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【贪心】种树

今晚把困扰了好久的贪心题做出来了,给大家分享一下思路。 题目描述  一条街的一边有几座房子。因为环保原因居民想要在路边种些树。路边的地区被分割成块,并被编号成1..N。每个部分为一个单位尺寸大小并最多可种一棵树。每个居民想在门前种些树并指定了三个号码B,E,T。这三个数表示该居民想在B和E之间最少种T棵树。当然,B≤E,居民必须记住在指定区不能种多于区域地块数的树,所以T≤E-B+l。居民们想...

一只酷酷光儿的博客 1204

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【国家集训队2011】【BZOJ2151】种树

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

CreationAugust is 14 years old forever 1349

洛谷P9755 [CSP-S 2023] 种树【题解】【二分+贪心】

本题耗时长的关键原因:1.代码中出现变量引用错误的弱智错误。2.向上下取整运算的不严谨。3.边界条件考虑不全。好题。综合考察了二分与贪心。做的过程中明显感觉贪心过程独立思考难以想出,后续要加强贪心的练习。CNOICNOICNOI近几年考的贪心有点意思。

MorningLa的博客 1143

种树【贪心】

某条街被划为 n 条路段,这 n 条路段依次编号为 1………n。每个路段最多可以种一棵树。现在居民们给出了 h 组建议,每组建议包含三个整数 b,e,t,表示居民希望在路段 b 到 e 之间至少要种 t棵树。这些建议所给路段的区间可以交叉。请问:如果要满足所有居民的建议,至少要种多少棵树。

zhouhaoNB_的博客 1013

bzoj 2151 种树 —— 思路+链表

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2151 先都放进堆里取最大的,但选了一个就不能选它两边的,所以可能不是最优,要有“反悔”的措施; 可以取出一个后把它两边的位置 l,r 在链表中删除,然后再加入一个元素 a[x] = a[l] + a[r] - a[x],如果日后选了这个元素,就表示“反悔”了,当初不选 x 而是...

aodan5477的博客 201

bzoj 2151 种树 贪心+堆

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

mysterynoip的博客 285

[bzoj2151][贪心]种树

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

Rose_max的博客 560

BZOJ2151 种树

额,好久不刷BZ了,这个月一直在做TC和CF-_- 这题,每次选当前最大的,然后把这个,这个左边和这个右边都删了,在这个位置加进来一个新数,值等于左边加右边减自己 用链表+set维护即可 跟生日礼物基本一样 #include #include #include #include #include #include #include #include #include #include #i

neither_nor 704

国家集训队 种树 题解

题目传送门 题目大意: 有一个圆环状的广场,不能在相邻的位置种树,每个位置种树有一个美观度,现在要求美观度最大。 题解 考虑贪心。 每次取美观度最大的位置即可,但是要考虑一种需要反悔的情况——取 xxx 旁边的两个位置比取 xxx 更优。那么只需要在取了 xxx 之后,往堆里面加一个 val[pre]+val[next]−val[x]val[pre]+val[next]-val[x]val[pre...

a_forever_dream的博客 325

[国家集训队]种树

戳我看题面 以每个坑种树的收益建一个大根堆 填上一个坑后,向堆加入坑两边收益减去坑的收益,提供反悔的机会 这与网络流很像 用链表存前驱后继 #include&lt;cstdio&gt; #include&lt;queue&gt; using namespace std; struct A{int id,x; }; const int N=2e5+5; int n,m,pre[N]...

YYHS_WSF的博客 324

BZOJ2151 种树 贪心+双向链表+优先队列

#include #define LL long long #define clr(x,i) memset(x,i,sizeof(x)) #define mp make_pair #define pii pair using namespace std; const int N=200005; int n,m,a[N],nex[N],pre[N],ans,vist[N]; priority_que

Wolf_Reiser的博客 420
上一篇: [国家集训队2011]拆迁队&nbsp;解题报告
下一篇: [国家集训队2011]happiness(吴确)…
wmdcstdio
博客等级 码龄12年 76粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值