题目:
一场考试包含3道题目,难度满足:
a<= b<= c
b - a<= 10
c - b<= 10
求,最少还需要求出多少题目。
题目来源:http://exercise.acmcoder.com/online/online_judge_ques?ques_id=3339&konwledgeId=158
样例:
输入:
4
20 35 23 40
输出:
2
思路:
- 先进行排序;
- 满足条件的3个元素,应该是相邻的3个元素;
- 另外创建一个数组作为标志;
- 对剩余的元素,考虑两两之间的距离,然后在考虑需要在中间插入多少个元素。
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNextInt()){
int n = in.nextInt();
int[] arr = new int[n];
for(int i=0; i<n; i++){
arr[i] = in.nextInt();
}
//先进行排序。能满足题意的都是相邻的3个元素
Arrays.sort(arr);
//设置标志
boolean[] flags = new boolean[n];
Arrays.fill(flags, true);
for(int i=0; i<n-2; i++){
int val1 = arr[i];
int val2 = arr[i+1];
int val3 = arr[i+2];
boolean b1 = flags[i];
boolean b2 = flags[i+1];
boolean b3 = flags[i+2];
//先把能满足题意的3个元素挑出来
if(b1 && b2 && b3 && (val2-val1<=10) && (val3-val2<=10)){
flags[i] = false;
flags[i+1] = false;
flags[i+2] = false;
}
}
//这是剩下的部分
int[] remain = new int[n];
int m=0;
for(int i=0; i<n; i++){
if(flags[i]){
remain[m++]=arr[i];
}
}
int result = 0;
//剩余的元素
if(m!=0){
boolean[] flags2 = new boolean[m];
Arrays.fill(flags2, true);
for(int i=0; i<m-1; i++){
int val1 = remain[i];
int val2 = remain[i+1];
if(val2-val1>20){ //2元素之间相差过大,只能在中间插入2个元素
flags2[i] = false;
result += 2;
}else{ //这里包含两种情况(x<=10,10<x<=20 ),不过这两种情况的效果一样
flags2[i] = false;
flags2[i+1] = false;
result++;
i++;
}
}
//注意要对最后一个元素进行特殊处理
if(flags2[m-1])
result += 2;
}
System.out.println(result);
}
}
}