计挑-Java-20-编程4

小明今天收了N个鸡蛋,每个鸡蛋各有重量,现在小明想找M个重量差距最小的鸡蛋摆成一盒出售,输出符合条件的最重一盒鸡蛋的总重量

输入说明:第一行,鸡蛋个数N(N<1000) 每盒个数M(M<N);第二行,N个鸡蛋重量(浮点)
输出说明:符合条件的最重一盒鸡蛋的总重量(保留2位小数)
输入样例:8 4
11 9 12 5 10 19 8 6
输出样例:42.00

什么叫“M个重量差距最小”?
重量差距的和最小?两两重量差的和?选M个,那么重量差有M-1个
案例中是:9+10+11+12=42,重量差的和就是4

两个两个考虑重量差实在是太麻烦的,其实也可以排序然后考虑首位的重量差吧,取4个就行

这道题其实可以先排序,然后转换为找头尾相差最小的M个数字(长度为M的子数组),并返回他们的和

好像还是滑动窗口,感觉有点像滑动窗口的最大值
……
如果做了一步排序预处理,就是…但是它要的是和,理论上来说可以全部算出来,但是这样的时间空间复杂度太大了吧

我看到了力扣的1984,简直一模一样但是这题更麻烦一些,他要的是所有数的max,而不只是最大最小数字和的差

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(stringTokenizer.nextToken());
        int m = Integer.parseInt(stringTokenizer.nextToken());

        br.readLine();
        stringTokenizer = new StringTokenizer(br.readLine());

/*        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        int m = scanner.nextInt();*/

        double[] nums = new double[n];

        for(int i=0;i<n;i++) nums[i]=Float.parseFloat(stringTokenizer.nextToken());
        // for(int i=0;i<n;i++) nums[i]= scanner.nextDouble();

        Arrays.sort(nums);

        double minSum = 0;

        // 初始化滑动窗口
        for(int i=0;i<m;i++) minSum+=nums[i];

        double difference = nums[m-1]-nums[0];
        double tempSum = minSum;

        for(int j = m;j<n;j++){
            tempSum+=(nums[j]-nums[j-m]);
            double temp = nums[j]-nums[j-m+1];
            if(temp<=difference){
                minSum = tempSum;
                difference = temp;
            }
        }
        System.out.printf("%.2f",minSum);
    }

就是有两个死活过不了,我照着别人的正确答案反复看了好几遍,不知道问题出在哪里

这是别人的AC答案

import java.util.*;
 
public class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
      int n = sc.nextInt();
      int m = sc.nextInt();
     double[] num = new double[n];
      for(int i=0;i<n;i++){
			num[i]=sc.nextDouble();
      }
      Arrays.sort(num);
      double maxSum = 0;
      double minDifferValue = Double.MAX_VALUE;
      for(int i=0;i<n-m;i++){
        double sum = 0;
    //数组排好序后M为一组,一组差距值为这一 组末尾元素减这一组第一个                                       
        double differValue = num[i+m-1]-num[i];                                                                         
        for(int j = 0;j<m;j++){
          sum+=num[j+i];
        }
        if(differValue<=minDifferValue){
          maxSum = sum;
          minDifferValue=differValue;
        }
      }
     System.out.print(String.format("%.2f",maxSum)); 
    }
}
posted @ 2022-11-27 17:05  YaosGHC  阅读(57)  评论(0)    收藏  举报