2020全国高校计算机能力挑战赛

17题:收到N个鸡蛋,每个鸡蛋各有重量,找出M个重量差距最小的鸡蛋摆出一盒出售,输出最重一盒鸡蛋的总重量。

输入:
8 4
11 9 12 5 10 19 8 6

输出:
42

  • 思路:要找出M个重量差距最小的放在一盒(即一组),可以先将所有鸡蛋的重量(数组中所有元素)从小到大排序,找出每组的最大值 - 最小值,其中差值最小的且数组元素总和最大的一组即为所求,输出这组的元素总和。

  • 实现步骤:

    • 将数组进行排序(采用了快速排序,具体讲解请见另一篇博文)
    • 将N- M + 1组的差值保存在abs数组
    • 找出abs数组的最小值(与排序后nums的索引相同)
    • 上面找出的最小值可能有多个元素相同为最小值,从后向前遍历abs数组,找到最小值的那组nums元素,输出它们的和。
    • 题目要求输入的N和M是整数,鸡蛋重量和最后的输出都是浮点型,输出结果保留两位小数。
    public class Main {
      public static void main(String[] args) {
          Scanner sc = new Scanner(System.in);
          String str1 = sc.nextLine();
          String str2 = sc.nextLine();
          String[] num = str1.split(" ");
          int N = Integer.parseInt(num[0]);
          int M = Integer.parseInt(num[1]);
          String[] ff = str2.split(" ");
    
          float[] nums = new float[N];
          for(int i = 0; i < N; i++){
              nums[i] = Float.parseFloat(ff[i]);
          }
          //        Arrays.sort(nums);
          quickSort(nums,0,nums.length - 1);
    
          float res = 0;
          //M个重量差距最小 即找出最小差值
          float[] abs = new float[N - M + 1];
          for(int i = 0; i < N - M + 1; i++){
                  abs[i] = nums[i + M - 1] - nums[i];
          }
          //找出abs中的最小值
          float min = abs[0];
          for(int i = 0; i < abs.length; i++){
              if(abs[i] < min){
                  min = abs[i];
              }
          }
          //返回abs[i]中元素的和
          for(int i = abs.length - 1; i >= 0 ; i--){
              if(min == abs[i]){
                  //3-6 N=8 M=4 i=6
                  for(int j = i + (N - M -1); j >= i ; j--){
                      res += nums[j];
                  }
                  break;
              }
          }
          //题目要求结果保留两位小数
          DecimalFormat fnum  =   new  DecimalFormat("##0.00");
          String dd = fnum.format(res);
          System.out.println(dd);
      }
      //快速排序
      public static void quickSort(float[] nums, int start, int end) {
          //数组有多个元素进行排序
          if (start < end) {
              float base = nums[start];//以要进行排序数组第0个元素为base
              int left = start;//左指针
              int right = end;//右指针
              while (left < right) {
                  //从右向左找,比base大,right--
                  while (left< right && nums[right] >= base) {
                      right--;
                  }
                  //比base小,替换left所在位置的数字
                  nums[left] = nums[right];
                  //从左向右找,比base小,left++
                  while (left < right && nums[left] <= base){
                      left++;
                  }
                  //比base大,替换right所在位置的数字
                  nums[right] = nums[left];
              }
              //交换base与此时left、right指向的元素
              float temp = nums[left];
              nums[left] = base;//此时left=right,用base替换这个位置的数字
              base = temp;
              //排列比base小的数字的数组
              quickSort(nums, start, left - 1);
              //排列比base大的数字的数组
              quickSort(nums, left + 1, end);
          }
      }
    }
    
  • 运行结果:
    在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值