思路:首先不是每个都要是一,因为平衡要尽量大,只要保证两个数互余且有一个数要大于n(否则分不了)注意此时其中一个数也和x互余,更新sum等于其中一个小的(因为是最大公约数),不断更新即可。
代码如下:
#include<stdio.h>
int max(int x,int y)
{
if(x>y)
y=x;
return y;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int x,n,sum=0;
scanf("%d%d",&x,&n);
for(int i=1;i*i<=x;i++)
{
if(x%i==0)
{
int s1=i,s2=x/i;
if(s1>=n)
sum=max(sum,s2);
else if(s2>=n)
sum=max(sum,s1);
}
}
printf("%d\n",sum);
}
return 0;
}
思路:将棋盘分为4个象限无论在哪个象限都一样,那么我们就统一为第一象限,可以发现规律,如果n=m,那么输出为n*2;如果n!=m,那么输出为他们的差*2+小值*2-1;仔细读题就可以发现,先走完小一点的(注意要交叉走,然后走一步停一步,直到走完)。
代码如下:
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
if(n<0)
n=-n;
if(m<0)
m=-m;
if(n<m)
{
int k=n;
n=m;
m=k;
}
int sum=0;
if(n==m)
{
sum+=2*n;
}
else{
int h=n-m;
sum+=h*2;
sum+=m*2;
sum-=1;
}
printf("%d\n",sum);
}
return 0;
}