宇宙条的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)。
输出描述:
输出只包括一行,即所求的答案。
解法分析
看到这样的问题,条件反射一般的先排序.这样做感觉上总是对的.
构建一个只有能存储三个数的辅助栈(实际上是两个数).
遍历排序之后的数据,初始的出题数count = 0
分三种情况讨论
case1. 栈中为空
这个时候没什么好说的,直接入栈
case2. 栈中为一个数
那么将当前数和栈中的数作比较
- 若小于10入栈
- 小于10大于20, 出栈操作, 然后count += 1
- 大于20,出栈操作,然后当前数据入栈,然后count += 2
case3. 栈中为两个数
- 若小于10,出栈操作
- 若大于10,出栈操作,当前数据入栈,然后count += 1
之后判断栈是否为空
若不为空,要知道栈的大小k, count += (3 - k).
赌一毛钱这有可能出现不是最优解的情况, 但我这样写之后就直接AC了.撸过了就不想了.我太懒了QAQ.
代码
1 |
|