题意:
给定一个a数组和一个全为0的b数组,每次操作可以将a[i]加到b数组,或减到b数组,问最少几次操作能使b数组递增
思路:
观察样例可知,把前面几个数减到b数组,把后面的几个数加到b数组,即可使得b数组递增
问题是0的位置我们不知道
因此我们去枚举0的位置,然后去模拟,把其他数模拟出来即可
模拟的时候没必要while循环减或加,直接除一除,算一下贡献就好了
tips:开ll的时候无穷大要取1e18而不是0x3f3f3f3f,否则就wa5了
Code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxn=5e3+10,mnf=1e18;
int n,res=0,ans=mnf,tmp=0;
int a[mxn],b[mxn];
void solve(){
ans=mnf;res=0;tmp=0;
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++){
tmp=0;
memset(b,0,sizeof(b));
for(int j=i-1;j>=1;j--){
res=(abs(b[j+1])/a[j])+1;
b[j]-=res*a[j];
tmp+=res;
}
for(int j=i+1;j<=n;j++){
res=(abs(b[j-1])/a[j])+1;
b[j]+=res*a[j];
tmp+=res;
}
ans=min(ans,tmp);
}
printf("%lld\n",ans);
}
signed main(){
int T=1;
//scanf("%lld",&T);
while(T--)solve();
return 0;
}