题解 P5019 【铺设道路】
题目链接
我的博客
众所周知,这道题和积木大赛是同一道题
题意就是给出一段自然数序列,每次操作
贪心做法
样例
6
4 3 2 5 3 5
大概长这个样子
我们考虑第一列的四块格子,最少需要
在考虑第二列的
第三列的格子也都可以一起消除掉
考虑第四列,我们可以发现,第四列下面的两个格子在前面的操作中可以一起消除,但是上面的三个是至少再进行三次操作才能消除的
而第五列下面的两个格子在第一列的操作中可以消除,上面的一个格子可以在第四列的操作中删除
考虑第六列,上面的
那么答案就是
这样大概可以总结出做法:当
贪心证明
下面用差分序列给出这个贪心的证明:
我们对原序列
原序列不妨在最后加一个
6
4 3 2 5 3 5 0
差分数组是
4 -1 -1 3 -2 2 -5
每次操作可以表示为
最终的状态就是差分数组全部变成
首先,每次操作最多让一个大于零的
下面要证明
我们只要每次操作能让一个大于
然而有一个限制条件:
我们可以利用以下性质构造解法:
性质1:由题意知任意时刻
性质2:由于
于是有:每次选一个大于零的
所以存在至少一种操作方法可以在
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN=100010;
int n,ans;
int main()
{
scanf("%d",&n);
int x,last=0;
for(int i=1;i<=n;++i){
scanf("%d",&x);
if(x>last) ans+=x-last;
last=x;
}
printf("%d\n",ans);
return 0;
}