题目描述
A与B两人玩一个游戏,这个游戏有若干个回合(可能0回合)。游戏的回合依次标号为1,2,3,4…。你不需要关心游戏的内容,现在只要知道第i回合胜者会获得2*i-1分,每回合游戏不存在平局。现在已知A和B在游戏结束时各获得了x分与y分的总分。问A在这个游戏中至少获胜了几盘?如果给出的x与y一定不会出现那么输出-1.
Input
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5
每组测试数据有相同的结构构成:
每组数据一行包含两个整数x,y,表示A与B最后的总得分,其中0<=x,y<=1,000,000,000,000。
Output
每组数据一行输出,即A最少获胜了几盘,非法的x与y对输出-1。
样例
input
3
8 17
17 8
0 0
output
2
3
0
题解
这道题 可能就是传说中的乱搞题找规律题???
-1的情况很好判断,不外呼两种情况
1、x=2 or y=2
2、x+y不为完全平方数
然后就贪心就可以了,因为是至少,所以一直取最大就行了
然后要注意到的是x=0或者y=0的情况
当x=0的时候,ans=0;
当y=0的时候,ans=n;
然后注意x,y得开long long就可以了。
var k,t,n,ans,i:longint;
x,y:int64;
begin
readln(t);
for k:=1 to t do
begin
ans:=0;
readln(x,y);
if (x=2) or (y=2) then begin writeln(-1); continue; end;
n:=trunc(sqrt(x+y));
if x=0 then begin writeln(0); continue; end;
if y=0 then begin writeln(n); continue; end;
if n*n<>(x+y) then begin writeln(-1); continue; end;
for i:=n downto 1 do
if x>(2*i-1) then
begin
inc(Ans);
dec(x,i*2-1);
end
else begin
if x mod 2=1 then inc(Ans) else inc(Ans,2);
break;
end;
writeln(ans);
end;
end.