计挑-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));
}
}

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16930101.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(48)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起