TopCoder SRM 639 Div.2 500 AliceGameEasy

本文探讨了如何通过二次方程解决数学问题,具体应用于计算在给定总分数的情况下,玩家A至少需要赢得多少场比赛。通过解析二次方程的根和应用贪心策略,实现高效计算。

题意: 一个游戏有n轮,有A和B比赛,谁在第 i 轮得胜,就获得 i 分,给出x,y,问A得x分,B得y分有没有可能,如果有,输出A最少赢的盘数

解题思路:

  首先判断n(n+1)/2 = (x+y)是否有解,即是否存在n为整数,使得所有分数的和加起来为x+y,即判断n2+n-2(x+y)=0,存在整数解,

   根据二次方程的根为(-1±Δ)/2 为整数,其中Δ=√(1+8(x+y)) , 即判断1+8(x+y)是否能开方以及Δ是否为奇数(如果Δ为偶数,则根不是整数)

如果前面条件满足,在通过贪心,从n开始累加使的其值大于x位置,此时个数即为A最少赢的盘数,如果x<n ,则只要在分数为x的时候赢即可,即x

   long long findMinimumValue(long long x, long long y) {
	    long long score = 1 + 8*(x+y);
        long long tmp = sqrt(score);
        if(tmp*tmp != score || tmp%2 == 0) return -1;
        else{
            long long n = (tmp-1)/2, res = 0;
            if(x  <= n) return res;
            for(int i = n; x > 0; -- i ){x-=i;res++;}
            return res;
        }
    }

  

转载于:https://www.cnblogs.com/xiongqiangcs/p/4151988.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值