NOIP 2018 提高组 复赛 第一天 第一题 铺设道路 road 题解 分治算法 边界处理
总目录详见:NOIP 提高组 复赛 试题 目录 信奥 历年
在线测评地址:https://www.luogu.com.cn/problem/P5019
样例模拟过程如下:
位置:1 2 3 4 5 6
数值:4 3 2 5 3 5
数值:3 2 1 4 2 4 区间[1,6]
数值:2 1 0 3 1 3 区间[1,6]
数值:1 0 0 3 1 3 区间[1,2]
数值:0 0 0 3 1 3 区间[1,1]
数值:0 0 0 2 0 2 区间[4,6]
数值:0 0 0 1 0 2 区间[4,4]
数值:0 0 0 0 0 2 区间[4,4]
数值:0 0 0 0 0 1 区间[6,6]
数值:0 0 0 0 0 0 区间[6,6]
样例模拟完成,发现是分治算法,AC代码如下:
#include <stdio.h>
#define maxn 100010
#define LL long long
int n,d[maxn];
LL cnt;
void change(int left,int right){
int i,min=maxn,l,r;
for(i=left;i<=right;i++)
if(min>d[i])min=d[i];
cnt+=min;
for(i=left;i<=right;i++)d[i]-=min;
l=0,r=0;
for(i=left;i<=right;i++){
if(d[i]!=0){
if(l==0)l=i;
r=i;
}else if(d[i]==0){
if(l)change(l,r);
l=0;
}
}
if(d[right]&&l)change(l,r);//边界处理
}
int main(){
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&d[i]);
change(1,n);
printf("%lld\n",cnt);
return 0;
}