#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int a[N]={};
int main()
{
int t;
cin>>t;
while(t)
{
t--;
int n;
cin>>n;
long long sum=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=n;i>=2;i--)
{
if(a[i]<a[i-1])
{
int y=((a[i-1]+a[i]-1)/a[i]);
a[i-1]=a[i-1]/y;
sum+=y-1;
}
}
cout<<sum<<endl;
}
}
先附上代码。
这个题作为一个贪心,一定会给你一个公式去推,所以O(n),是这个题的唯一选择,然后我们发现前面的数会给后面带来影响。所以从后向前,我之前有一个思路,就是通过队列去存一个数分离的数,你会发现总次数是y-1,而当前数的变化是除以y的,所以,我们能够总结浓缩到上述代码。
|||||||||||||||||||||||
萌新萌新,第一次发,写的不好QAQ