计挑-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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步