51nod-1390-游戏得分

题目描述

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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值