網易筆試編程-數字遊戲

小易邀請你玩一個數字遊戲,小易給你一系列的整數。你們倆使用這些整數玩遊戲。每次小易會任意說一個數字出來,然後你需要從這一系列數字中選取一部分出來讓它們的和等於小易所說的數字。 例如: 如果{2,1,2,7}是你有的一系列數,小易說的數字是11.你可以得到方案2+2+7 = 11.如果頑皮的小易想坑你,他說的數字是6,那麼你沒有辦法拼湊出和爲6 現在小易給你n個數,讓你找出無法從n個數中選取部分求和的數字中的最小數。
輸入描述:
輸入第一行爲數字個數n (n ≤ 20)
第二行爲n個數xi (1 ≤ xi ≤ 100000)
輸出描述:
輸出最小不能由n個數選取求和組成的數
輸入例子:
3
5 1 2
輸出例子:
4
這是牛客網上一名同學的做法:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(void)
{
    int n;
    cin >> n;
    vector<int> nums;
    while (n--)
    {
        int temp;
        cin >> temp;
        nums.push_back(temp);
    }
    sort(nums.begin(), nums.end());
    int sum = 0;
    for (unsigned int i = 0; i < nums.size(); ++i)
    {
        if (nums[i] - sum > 1)
        {
            break;
        }
        else
        {
            sum += nums[i];
        }
    }
    cout << sum + 1 << endl;
}

我在這裏記錄下我的理解思路:
這個題目可以轉化爲判斷一個數字序列是否是連續的,如果不是連續的,斷點在哪兒?證明如下:
假設有一系列數字a1,a2,a3,… ,an能自由組合成連續的0~kn個數,那麼a1, a2, a3, …, an, a(n+1)就能自由組合成連續的0 ~kn和a(n+1) ~kn + a(n + 1),若要證明0 ~ kn + a(n+1)是連續的,只要證明kn和a(n+1)是連續的,要想使kn和a(n+1)是連續的,只需要a(n+1) - kn <= 1即可。而這裏的kn是等於a1 + a2 + a3 +… + an的。如果沒有數字,當然能夠得到0~0個連續的數字,也就是說當沒有數字,kn爲零時,假設成立,那只需要滿足a(n+1) - kn <= 1即可得到任意連續的組合,也就是程序中所說的當
a(n + 1) - kn > 1時,a(n+1)和kn之間是不連續的,而不連續的最小數字就是kn+1。
若有不對之處,敬請指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章