标签:blog sp for on div log bs ad as
题意: 一个游戏有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; } }
TopCoder SRM 639 Div.2 500 AliceGameEasy
标签:blog sp for on div log bs ad as
原文地址:http://www.cnblogs.com/xiongqiangcs/p/4151988.html