求出题数目

题目:
一场考试包含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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值