题目描述
头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队,每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来,在选题之前,我们对题目进行了盲审,并定出了每道题的难度系统。一场考试包含3道开放性题目,假设他们的难度从小到大分别为a,b,c,我们希望这3道题能满足下列条件:
a<=b<=c
b-a<=10
c-b<=10
所有出题人一共出了n道开放性题目。现在我们想把这n道题分布到若干场考试中(1场或多场,每道题都必须使用且只能用一次),然而由于上述条件的限制,可能有一些考试没法凑够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
答案描述
1.将难易程度排序,从小到大,从第二个数字开始遍历。
2.定义一个标志t,表示当前数字的前一个数字为三个数字中的第几个。
3.比较当前数字和前一个数字的之间的间隔。
4.如果间隔小于10,则t++,跳过,不做处理。如果t大于等于3,则说明已经凑成了完整的一组,需要将t赋值为1.
5.如果间隔小于20,并且前一个数为第一个数,则说明只需要在中间插入一个数即可凑成一组。此时,count++,t = 3;
6.如果前一个数的标记值t == 1; 并且间隔大于20,则说明需要在钱一个数后面加上两个数才能将前一个数凑成一个组。
7.如果钱一个数的标记值t == 2; 并且间隔大于10, 则说明需要在钱一个数后面加上一个数才能将前两个数凑成一个组。
8.最后一个数在循环中可能没有处理,所以需要在循环外重新添加。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] d = new int[n];
Arrays.sort(d);
int t = 1;
int count = 0;
for (int i = 1; i < n; i++){
if (t < 3){
if (d[i] - d[ i - 1] <= 10){
t++;
}else if (t == 1 && d[i] - d[i - 1] <=20){
count++;
t = 3;
}else {
count+= 3 - t;
t = 1;
}
}else {
t = 1;
}
}
count += 3 - t;
System.out.println(count);
}
}