题解 P1969 【积木大赛】

iwprc

2017-08-15 17:19:25

Solution

这道题我用了分治的方法,如果当前要计算搭建区间[l,r] 所需要的操作数,那么它就等于左右两个区间的操作数之和 减去两个区间连接部分的最小值,因为重复了,所以两边可 以连接起来。 f(l,r)=f(l,mid)+f(mid+1,r)-min(h[mid],h[mid+1]) 代码: ```cpp #include<cstdio> short h[100000]; int n,i; short min(short x,short y){return x<y?x:y;} int f(int l,int r){ if(l==r) return h[l]; int mid=l+r>>1; return f(l,mid)+f(mid+1,r)-min(h[mid],h[mid+1]); } int main(){ scanf("%d",&n); for(;i<n;i++) scanf("%hd",h+i); printf("%d",f(0,n-1)); return 0; } 时间复杂度:O(2n) ```