题目:
头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队,每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来,在选题之前,我们对题目进行了盲审,并定出了每道题的难度系统。一场考试包含3道开放性题目,假设他们的难度从小到大分别为a,b,c,我们希望这3道题能满足下列条件:
a<=b<=c
b-a<=10
c-b<=10
所有出题人一共出了n道开放性题目。现在我们想把这n道题分布到若干场考试中(1场或多场,每道题都必须使用且只能用一次),然而由于上述条件的限制,可能有一些考试没法凑够3道题,因此出题人就需要多出一些适当难度的题目来让每场考试都达到要求,然而我们出题已经出得很累了,你能计算出我们最少还需要再出几道题吗?
思路:
对题目难度进行排序,从最大值开始选择,如果次大值小于最大值10以上,就必须加一道题目,当前最大值可以看出是 最大值-10,这样能包含更多的题目。设置flag标志,表示当前考场题目数,如果题目满足三个,本考场不需要添加题目,继续向下数。最后循环遍历一遍后可以的到需要加的题目数,最后要加上剩下flag中没满足的数目,也就是最后一个考场需要添加的题目3-flag。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin>>n;
int a = n;
vector<int> re;
while(a--) {
int b;
cin>>b;
re.push_back(b);
}
sort(re.begin(),re.end());
int flag = 1, cur = re[n-1], count = 0;
for(int i = n-2; i >= 0; i--) {
if(flag == 3) {
cur = re[i];
flag = 1;
} else {
if(cur-re[i]<=10) {
flag++;
cur = re[i];
} else {
flag ++;
count++;
cur = cur- 10;
i++;
}
}
}
cout<<count+3-flag;
return 0;
}