单峰函数。
n=1,2,3的时候进行特判。
n>3的时候进行普适性寻找,发现可以分解为3个值,num1是复制的步数,num2是加一的步数,num3是复制与加一过程中出现的余渣,用n%i来得,然后num1+num2+num3就是从i值开始复制的总步数,如果出现下一个比上一个大的情况,则说明之后都会大了,就输出上一个的步数(即为最小步数)。
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
if(n==1)
{
printf("0\n");
continue;
}
else if(n==2)
{
printf("1\n");
continue;
}
else if(n==3)
{
printf("2\n");
}
for(int i=1;i<n;i++)
{
int num1=n/i-1;
int num2=i-1;
int num3=n%i;
if(num3%i!=0)
{
num3=num3/i+1;
}
else
{
num3=num3/i;
}
a[i]=num1+num2+num3;
//printf("num1=%d,num2=%d,num3=%d\n",num1,num2,num3);
//printf("a[i]=%d\n",a[i]);
if(a[i]>a[i-1]&&i!=1)
{
printf("%d\n",a[i-1]);
break;
}
}
}
return 0;
版权声明:本文为Rediso原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。