时间限制:C/C++语言 1000MS;其余语言 3000MS
内存限制:C/C++语言 65536KB;其余语言 589824KB
题目描述:
给出一个序列包含n个正整数的序列A,你能够从中删除若干个数,使得剩下的数字中的最大值和最小值之差不超过x,请问最少删除多少个数字。java
输入
输入第一行仅包含两个正整数n和x,表示给出的序列的长度和给定的正整数。(1<=n<=1000,1<=x<=10000)web
接下来一行有n个正整数,即这个序列,中间用空格隔开。(1<=a_i<=10000)数组
输出
输出仅包含一个正整数,表示最少删除的数字的数量。svg
样例输入
5 2
2 1 3 2 5
样例输出
1大数据
提示:极端状况下,当删除到仅剩1个数时,最大值和最小值的差为0,故不会出现无解的状况。spa
贪心思想模拟人为删除
使用Arrays.sort()将输入数组排序,而后每次删掉数组头尾中与数组中位数相差较大的那个,count++,直至数组头尾之差不超过xcode
刚开始想用平均数,计算sum时误将sum类型声明为了int,遇到大数据时会溢出。xml
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] nx = br.readLine().split(" "); int n = Integer.parseInt(nx[0]); int x = Integer.parseInt(nx[1]); int count = 0; String[] input = br.readLine().split(" "); int[] nums = new int[n]; for (int i = 0; i <n ; i++) { nums[i] = Integer.parseInt(input[i]); } Arrays.sort(nums); int max = nums[n-1]; int min = nums[0]; int avg = n/2; if (max-min <= x){ System.out.print(count); } else { delete(nums,0 ,n-1, x,avg,count); } } private static void delete(int[] nums, int start, int end, int x,int avg, int count) { while (nums[end]-nums[start]>x){ int chaMax = nums[end] - nums[avg]; int chaMin = nums[avg] - nums[0]; if (chaMax>chaMin){ end--; } else { start++; } count++; avg = (start+end)/2; } System.out.print(count); } }