- 题目描述
头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队。每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来。在选题之前,我们对题目进行了盲审,并定出了每道题的难度系数。一场考试包含3道开放性题目,假设他们的难度从小到大分别为a, b, c,我们希望这3道题能满足下列条件:
a<= b<= c
b - a<= 10
c - b<= 10
所有出题人一共出了n道开放性题目。现在我们想把这n道题分布到若干场考试中(1场或多场,每道题都必须使用且只能用一次),然而由于上述条件的限制,可能有一些考试没法凑够3道题,因此出题人就需要多出一些适当难度的题目来让每场考试都达到要求。然而我们出题已经出得很累了,你能计算出我们最少还需要再出几道题吗?
这道题关键在于序列排好序后三个一组,也就是当前面m个元素的数目是3倍时,即使下一个元素和dm-1的差大于10也不要紧。那么思路应该是遍历序列,当之前元素比上一元素大10而且在子序列中,就要手动补上元素,并不能更新索引。
int main() {
int N;
cin >> N;
vector<int> num(N, 0);
for (int i = 0; i < N; ++i) {
cin >> num[i];
}
sort(num.begin(), num.end());
int res = 0, last = num[0], count = 1, i = 1;
while (i < N)
{
if (num[i] - last <= 10)
{
last = num[i];
i++;
}
else
{
if (count == 3)
{
last = num[i];
i++;
}
else
{
res++;
last += 10;
}
}
count++;
if (count > 3) count = 1;
}
N += res;
if (N % 3) res += (3 - N % 3);
cout << res << endl;
return 0;
}