题目大概意思是给你一个长度为n的数组a和一个长度为n的数组b,b开始的时候每一个元素都是0,你可以对b数组的每一个位置加上对应的a数组的元素,问你最少经过多少次操作可以使得b单调递增。
拿到题看了一下,肯定有一个点是0,我们只需要枚举每一个位置是0的时候找出最少的次数就可以了,时间复杂度是n2,对于5000绰绰有余,代码如下,记得开long long。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[5005],b[5005];
int main(){
int n;
cin>>n;
for(int i = 1;i<=n;i++){
cin>>a[i];
}
ll ans = (1LL<<60);
for(int i = 1;i<=n;i++){
ll res = 0;
b[i] = 0;
for(int j = i-1;j>=1;j--){
if(j == i-1){
b[j]-=a[j];
res++;
}
else{
res += (b[j]-b[j+1])/a[j]+1;
b[j] -= ((b[j]-b[j+1])/a[j]+1)*a[j];
}
}
for(int j = i+1;j<=n;j++){
if(j == i+1){
b[j] += a[j];
res++;
}
else{
res +=(b[j-1]-b[j])/a[j]+1;
b[j] += ((b[j-1]-b[j])/a[j]+1)*a[j];
}
}
memset(b,0,sizeof(b));
ans = min(ans,res);
}
cout<<ans<<endl;
}