题意:在给出的两个数A,B,找出最少需要几步可以从A到B,规则:第一步和最后一步必须是1,还有中途只可以比前一数大一,等于,或小一。。
第一种方法:从A,B开始依次加,然后距离减去步长,直到 dis<0 ,我们可以肯定的是,小于零的这部分C,一定小于当前的步长N,所以我们一定能在之前的步长中找到(N-C),也就可以填满这一部分。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n;
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
int a,b;
scanf("%d%d",&a,&b);
int dis = b - a ;
bool flag = false ;
int count = 0 ;
int step = 1 ;
while (dis > 0 )
{
dis -= step;
count++;
if (flag)
step++;
flag = !flag;
}
printf("%d\n",count);
}
return 0;
第二种方法:1+2+.....+(n-1)+n+(n-1)+....2+1 =n^2,这是我们在达到和为n^2在满足题意的情况下能确定的最少步数,设想我们如果 dis==n^2 ,那结果就显而易见了,当dis > n^2的时候,首先我们先确定最大的n满足 n^2 <= dis ,然后我们只要再找dis-n^2的数就可以,如果dis-n^2<=n,那只要再找一个,如果>n,但我们发现这个数一定<(n+1)^2-n^2
,那这个数一定可以化为数列中的两个数。。。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int t ;
scanf("%d",&t);
while (t--)
{
int a,b;
scanf("%d%d",&a,&b);
int dis = b - a ;
if (dis <= 3)
printf("%d\n",dis);
else
{
int n = sqrt(dis);
if ( n * n == dis)
printf("%d\n",2*n-1);
else if ((dis-n*n)<=n)
printf("%d\n",2*n);
else printf("%d\n",2*n+1);
}
}
return 0;
}