将一个序列修改成 a1<a2<...<am−1<am>am+1>...>an−1>an 的形式(只要存在 m 即可),一次修改定义为将 [l,r] 区间内的数都加一,求最少修改次数。
我的思路:确定 m,然后这时答案即为:max(调整左边的最小修改次数,调整右边的最小修改次数)。
#include<bits/stdc++.h>
using namespace std;
long long a[4000005];
long long dp_1[4000005],dp_2[4000005];
//dp_1[i] 1~i 升序的最小花费
//dp_2[i] i~n 降序的最小花费
int main(){
int n;
long long ans=9e18;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) dp_1[i]=dp_1[i-1]+max(0ll,a[i-1]-a[i]+1);
for(int i=n;i>=1;i--) dp_2[i]=dp_2[i+1]+max(0ll,a[i+1]-a[i]+1);
for(int i=1;i<=n;i++) ans=min(ans,max(dp_1[i],dp_2[i]));
for(int i=1;i<=n;i++) printf("%lld\n",max(dp_1[i],dp_2[i]));
printf("%lld",ans);
return 0;
}
全Wa。