题解:
因为可以加可以减,那么假定一个0,左为负右为正,绝对值都是向两边递增。直接枚举每一位为0时就好了,对剩下每一位再求出至少需要多少个次数,不能一个一个试,因为和上一个相比至少大1,拿上一数+1在除以a[i]后向上取整可以保证每次满足题意的最小次数。
因为最小值初始赋太小而wa了,,,注意pa,得是1e18级别的才能大于全部的ans。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
#define ll long long
#define sc scanf
#define pr printf
ll up(ll a,ll b){
ll k=a/b;
double c=1.0*a/b;
if(c-k>0)k++;
return k;
}
ll a[maxn];
ll b[maxn];
int main() {
int n;cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
ll ans=5e18;
for(int i=0;i<n;i++){
//memset(b,0,sizeof(b));
b[i]=0;
ll now=0;
if(i-1>=0){
b[i-1]=-a[i-1];
now++;
}
for(int j=i-2;j>=0;j--){
ll k=up(abs(b[j+1]-1),a[j]);
b[j]=-1*k*a[j];
now+=k;
}
if(i+1<n)
{
b[i+1]=a[i+1];
now++;
}
for(int j=i+2;j<n;j++){
ll k=up(b[j-1]+1,a[j]);
b[j]=k*a[j];
now+=k;
}
ans=min(ans,now);
} cout<<ans<<endl;
return 0;
}