题目大意:
给你一个长度为n的数组,求最少次操作,使得数组(非严格)递增。一次操作:Ai 变为 Ai^2。
不可能实现输出-1。
关键思路:
分子分母同时取对数,比值不变。
代码:
void solve()
{
ans=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>b[i],
a[i]=0;
for(int i=2;i<=n;i++)
{
if(a[i-1]==0&&b[i-1]<=b[i])//没有操作过,可以原数组比较
{
continue;
}
if(b[i]==1)//前面肯定有比1大的数
{
cout<<"-1\n";
return;
}
ll x=a[i-1];
double A=log(1.0*b[i-1])/log(1.0*b[i]);
ll y=ceil(x+log2(A));
a[i]=max(0ll,y); //不可以把数变小,所以不操作
ans+=a[i];
}
cout<<ans<<"\n";
/*
ll x=a[i-1];
long double A=logl((long double)b[i-1])/logl((long double)b[i]);
ll y=ceill(x+log2l(A));
a[i]=max(0ll,y); //不可以把数变小,所以不操作
ans+=a[i];
}
*/
明年再学md或者latex,看情况。
纯纯不务正业,为了省时间思路就这样。