2018腾讯秋招算法笔试题

小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
代码:


import math
print("请输入小q所获得得分数")
x=int(input())
print("请输入牛牛获得的分数")
y=int(input())
//通过分数总和一定是1到N之和,利用求根公式求解
sum_all=x+y
//判断N是否存在
if((-1+math.sqrt(1+8*sum_all))%2==0):
    N=(-1+int(math.sqrt(1+8*sum_all)))//2
else:
    print('-1')
    exit()
N_index=list(range(1,N+1))
length_N=len(N_index)
for i in range(length_N):
    tem=N_index[length_N-i-1:length_N]
    Sum_tem=sum(tem)
    if((Sum_tem>x)|(Sum_tem==x)):
        break
print(i+1)

题意:
首先利用x,y求出N的值,然后在1到N的list中寻找最小等于sum_x的数字,可以不必关心具体的是什么样的组合,假设最小的轮数为N_x,则sum_x的值一定处于N_index[length_N]+...+a[length_N-N_x+1]与length_N[length_N]+...+a[length_N-N_x+2]之间。
对示例进行分析:

N=6(取正整数)
N_INDEX={1,2,3,4,5,6}
6 6
11 6+5
15 6+5+4
18 6+5+4+3
20 6+5+4+3+2
21 6+5+4+3+2+1
7处于6与11之间,因此为2

你可能感兴趣的:(2018腾讯秋招算法笔试题)