P5019 铺设道路题解
一、贪心法
题目里给的样例是,可以选择一个区间进行“填坑”操作;我们的贪心策略是:
若,计数器;
贪心证明
假设现在有一个坑,但旁边又有一个坑。你肯定会选择把两个同时填充,都减;那么小的坑肯定会被大的坑“带着”填掉。大的坑也会减少的深度,可以说是“免费的”;所以这样贪心是对的。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1000010;
int a[N];
LL ans;
int n;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) if (a[i] > a[i - 1]) ans += a[i] - a[i - 1];
cout << ans;
return 0;
}
2、递推法
用表示前个坑所铺设的最少次数。
那么要做的只需比较一下当前的就是坑的深度)和,分两种情况:
1、如果,那么在填时就可以顺便把填上,这样显然更优,所以;
2、如果,那么在填时肯定要尽量把一块填上一部分(),剩余的就单独填。
所以,。
初始化,向后推就行了,复杂度大概是。
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
//递推法
int n, a[N];
int f[N]; //代表前i个区域被填充好的最少次数.套路,满满的套路
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
//递推出口,第一个有多大的坑,不能指望别人,都要靠自己来完成~
f[1] = a[1];
//从第2个开始进行递推
for (int i = 2; i <= n; i++) {
//递推式:见题解的分析过程
if (a[i] <= a[i - 1]) f[i] = f[i - 1];
else f[i] = f[i - 1] + (a[i] - a[i - 1]);
}
//输出大吉
cout << f[n] << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2018-07-21 在Centos中安装aria2c
2016-07-21 PHP、JAVA、C#、Object-C 通用的DES加密