腾讯2018算法题 python实现

小Q和牛牛玩了一个游戏,这个游戏进行了若干轮,每一轮都有一一个获胜者,获胜者将获得轮次的分数。 例如:第一轮小Q获胜,小Q将获得1分,第二轮牛牛获胜,牛牛将获得2分。 游戏结束后,小Q总共获得了x分,牛牛获得了y分。现在希望你能来计算一下小Q在所有轮次中获胜次数最少可以是多少。 更一般的,假设总共进行了N轮游戏,小Q最少需要在N轮中获胜多少次,使得小Q恰好获得x分,牛牛获得y分。
输入描述:
输入包括两个整数x,y(0 < x, y <=1012),表示小q获得的分数和牛牛获得的分数。
输出描述:
输出一一个正整数,表示小q最少进行的轮数,如果没有解,输出-1。
示例:
输入:
7 14
输出:
2

解题思路:
由题意可知求解N只用根据:x+y=∑N 来求解N。而x,y种必定有一个数是包含N的,直接选取x,y中的最大值设置为N的最大值。接下来求解小Q至少获取多少次。这就要求小Q在轮次数高的时候多次获胜,首先判断是否比N大,当比N小时,直接在该轮次获胜,那么小Q只获取一次。当比N大时,首先,在N轮的时候获胜,那么剩下的积分就是x-N,再对剩下的N-1轮运用此方法,最终求解出最少次。
对示例进行分析:(7+14)=(1+N)*N/2
求解出N=6
此时7>6 则表明小Q再第六轮获胜,7-6=1<6,则表明小Q再第一轮获胜即可,因此结果为2
注:求解N的时候可以用求解方程的解的方式求解,最后需要判断N是否为整数。

N, t, sum ,flag = 0,0,0,0
x,y = map(int,input().split(' '))
max_num = max(x,y)
for i in range(max_num):
    N = i
    if ((x+y) != (N*(N+1)/2)):
        flag = 0
    else:
        flag = 1
        break
if flag == 1:
    while x>=0:
        if x<=N:
            sum = t + 1
            break

        if x > N:
            x = x-N
            t += 1
            N -= 1
    print(sum)
else:
    print(-1)

你可能感兴趣的:(腾讯2018算法题 python实现)