题意:
给定一个数组代表建筑物高度,增加建筑物高度,求使得cool buiding数最大的最小花费。
如果i比它两侧的建筑物高则为cool buiding(开头和结尾都不是cool building)
思路:
因为cool buiding不能连续出现,如果n为奇数,从第二个开始每隔一个就是cool buiding,这样才能最大化。
n为偶数存在多种选法,维护一个花费的前缀和和后缀和,在枚举一下需要修改的位置即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int h[N];
ll pre[N/2],lst[N/2];
int n;
int main()
{
int t;
cin>>t;
while(t--){
memset(pre,0,sizeof(pre));
memset(lst,0,sizeof(lst));
cin>>n;
for(int i=1;i<=n;++i) cin>>h[i];
ll ans=0;
for(int i=2;i<n;i+=2){
int v=max(h[i-1],h[i+1]);
if(v>=h[i]) ans+=v-h[i]+1;
if(n%2==0) pre[i/2]=ans;
}
if(n%2==0){
ll minv=ans;
for(int i=n-1;i>1;i-=2){
int v=max(h[i-1],h[i+1]);
lst[i/2]=lst[(i+1)/2];
if(v>=h[i]) lst[i/2]+=v-h[i]+1;
}
for(int i=3;i<n;i+=2) minv=min(minv,lst[i/2]+pre[(i-2)/2]);
ans=minv;
}
cout<<ans<<endl;
}
return 0;
}