今日头条2017校招笔试题

问题描述:
头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队,每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来,在选题之前,我们对题目进行了盲审,并定出了每道题的难度系统。一场考试包含3道开放性题目,假设他们的难度从小到大分别为a,b,c,我们希望这3道题能满足下列条件:
a<=b<=c
b-a<=10
c-b<=10
所有出题人一共出了n道开放性题目。现在我们想把这n道题分布到若干场考试中(1场或多场,每道题都必须使用且只能用一次),然而由于上述条件的限制,可能有一些考试没法凑够3道题,因此出题人就需要多出一些适当难度的题目来让每场考试都达到要求,然而我们出题已经出得很累了,你能计算出我们最少还需要再出几道题吗?
输入描述:
输入的第一行包含一个整数n,表示目前已经出好的题目数量。
第二行给出每道题目的难度系数d1,d2,…,dn。
数据范围:
对于30%的数据,1 ≤ n,di ≤ 5;
对于100%的数据,1 ≤ n ≤ 10^5,1 ≤ di ≤ 100。
在样例中,一种可行的方案是添加2个难度分别为20和50的题目,这样可以组合成两场考试:(20 20 23)和(35,40,50)。
输出描述:
输出只包括一行,即所求的答案。
示例1:
输入:
4
20 35 23 40
输出:
2

#include 
#include 
#include 
using namespace std;

int main()
{
    int number;
    cin >> number;
    vector<int> input(number, 0);
    for (int i = 0; i < number; i++)
        cin >> input[i];
    sort(input.begin(), input.end());
    int extra = 0;
    for (int i = 1; i < input.size(); ++i)
    {
        if (input[i] - input[i - 1] > 10 && i % 3)
        {
            input.insert(input.begin()+i, input[i-1]+10);
            sort(input.begin(), input.end());
            ++extra;
        }
    }
    if (input.size() % 3 == 1)
    {
        input.insert(input.end(), input[input.size() - 1] + 10);
        ++extra;
        input.insert(input.end(), input[input.size() - 1] + 10);
        sort(input.begin(), input.end());
        ++extra;
    }
    if (input.size() % 3 == 2)
    {
        input.insert(input.end(), input[input.size() - 1] + 10);
        sort(input.begin(), input.end());
        ++extra;
    }

    cout << extra << endl;

    system("pause");
    return 0;
}

解题思路:
首先使用循环将输入的元素放入向量:

    for (int i = 0; i < number; i++)
        cin >> input[i];

比如输入为:
8
20 35 23 40 50 45 49 70
然后对向量中的元素进行排序:

sort(input.begin(), input.end());

得到的input为:20 23 35 40 45 49 50 70
添加的元素计算程序为:

for (int i = 1; i < input.size(); ++i)
    {
        if (input[i] - input[i - 1] > 10 && i % 3)
        {
            input.insert(input.begin()+i, input[i-1]+10);
            sort(input.begin(), input.end());
            ++extra;
        }
    }
    if (input.size() % 3 == 1)
    {
        input.insert(input.end(), input[input.size() - 1] + 10);
        ++extra;
        input.insert(input.end(), input[input.size() - 1] + 10);
        sort(input.begin(), input.end());
        ++extra;
    }
    if (input.size() % 3 == 2)
    {
        input.insert(input.end(), input[input.size() - 1] + 10);
        sort(input.begin(), input.end());
        ++extra;
    }

首先,利用for循环将不满足b-a<=10和c-b<=10的元素位置添加一个元素,添加的元素直接为前一个数加10,同时还需要判断是不是已经构成的三个一组,若是已经构成了三个一组,这第三个和第四个不需要满足上述条件,所以for循环中的判断语句为:input[i] - input[i - 1] > 10 && i % 3。
后面的

    if (input.size() % 3 == 1)
    {
        input.insert(input.end(), input[input.size() - 1] + 10);
        ++extra;
        input.insert(input.end(), input[input.size() - 1] + 10);
        sort(input.begin(), input.end());
        ++extra;
    }
    if (input.size() % 3 == 2)
    {
        input.insert(input.end(), input[input.size() - 1] + 10);
        sort(input.begin(), input.end());
        ++extra;
    }

作用为:与当前面元素均满足b-a<=10和c-b<=10,但是可能会使得最终最后一组不满足三个元素,所以在进行判断。

你可能感兴趣的:(C++,招聘笔试题目)