美文网首页
2018腾讯秋招算法笔试题

2018腾讯秋招算法笔试题

作者: 肉肉肉肉_包 | 来源:发表于2018-09-18 19:44 被阅读0次

    小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

    代码:

    long long x, y, N;
    int t = 0, sum = 0,flag = 0;
    cin >> x;
    cin >> y;
    for (N = 0; N <= (x > y ? x : y); N++){
        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;
        }
     }
      cout << sum;
    }
    else
        cout << -1;
    

    解题思路:

    由题意可知求解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是否为整数。

    相关文章

      网友评论

          本文标题:2018腾讯秋招算法笔试题

          本文链接:https://www.haomeiwen.com/subject/xtimnftx.html