CF1534B Histogram Ugliness 题解
题目大意
给定一个 列的直方图,第 列的高度为 。定义一个直方图的丑陋度为:该直方图所有裸露在外的竖线长度之和。现在你可以在直方图中选出一列,将这一列的高度减 ,现在求操作数+操作后直方图丑陋度的最小值。
题目解析
我们发现,只有将中间凸出来的方格去掉才能减小丑陋值。
我们发现,将中间凸出的方格的高度减去 之后就能将丑陋值减小 ,那么我们就只能去掉宽度为 凸出来的方格了,因为只有这样才能减小答案。
删的时候记得记录删的次数,保证删完之后当前列不能小于左右两边的任意一列,最后扫一遍得到丑陋值就可以了。
丑陋值的计算公式(这里设 ):
#include<cstdio> #define maxn 400039 #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; //#define debug typedef long long ll; typedef long long Type; inline int abs(int x){ return x>0?x:-x; } inline Type read(){ Type sum=0; int flag=0; char c=getchar(); while((c<'0'||c>'9')&&c!='-') c=getchar(); if(c=='-') c=getchar(),flag=1; while('0'<=c&&c<='9'){ sum=(sum<<1)+(sum<<3)+(c^48); c=getchar(); } if(flag) return -sum; return sum; } int T; int n; ll a[maxn]; ll res,ans,tmp; int main(){ //freopen(".in","r",stdin); //freopen(".out","w",stdout); T=read(); while(T--){ n=read(); for(int i=1;i<=n;i++) a[i]=read(); a[0]=a[n+1]=res=ans=0; for(int i=1;i<=n;i++) if(a[i]>a[i-1]&&a[i]>a[i+1]){//这里代表是中间凸出来的 tmp=max(a[i-1],a[i+1]); ans+=a[i]-tmp; a[i]=tmp; } for(int i=1;i<=n+1;i++) res+=abs(a[i]-a[i-1]); printf("%lld\n",ans+res); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具