C. Squaring
题目大意:
给你一个长度为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,看情况。
纯纯不务正业,为了省时间思路就这样。