华为OD题目:最短木板长度

package com.sf.ccmas.video.config.odd.od4;

import com.sf.cemp.framework.common.util.object.SfObjectUtil;
import org.aspectj.org.eclipse.jdt.core.IField;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 题目描述
 *
 * 【最短木板长度】
 *
 *
 *
 * 小明有 n 块木板,第 i ( 1 ≤ i ≤ n ) 块木板长度为 ai。
 * 小明买了一块长度为 m 的木料,这块木料可以切割成任意块,
 * 拼接到已有的木板上,用来加长木板。
 * 小明想让最短的木板尽量长。
 * 请问小明加长木板后,最短木板的长度可以为多少?
 *
 * 输入描述
 * 输入的第一行包含两个正整数,n(1≤n≤10^3),m(1≤m≤10^6)
 * n表示木板数,m表示木板长度。输入的第二行包含n个正整数,a1,a2,...an(1≤ai≤10^6)。
 *
 * 输出描述
 * 输出的唯一一行包含一个正整数,表示加长木板后,最短木板的长度最大可以为多少?
 *
 * 示例一:
 * 输入:
 * 5 3
 * 4 5 3 5 5
 * 输出:
 * 5
 *
 * 说明:
 * 给第1块木板长度增加1,给第3块木板长度增加2后,
 * 这5块木板长度变为[5,5,5,5,5],最短的木板的长度最大为5。
 *
 * 示例二:
 * 输入:
 * 5 2
 * 4 5 3 5 5
 * 输出:
 * 4
 *
 * 输入:
 * 5 8
 * 2 3 7 7 7
 *
 * 给第3块木板长度增加1后,
 * 这5块木板长度变为[4,5,4,5,5],剩余的木料长度为1。此时剩余木料无论给哪块木板加长,最短木料的长度都为4。
 *
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String strUp = scanner.nextLine();
        String strDown = scanner.nextLine();
        String[] splitUp = strUp.split(" ");
        int n =Integer.parseInt( splitUp[0]);
        int m =Integer.parseInt( splitUp[1]);
        String[] splitDown = strDown.split(" ");
        Arrays.sort(splitDown);
        int sum = Integer.parseInt(splitDown[0]);
        int left = 0;
        int total = m;
        for (int i = 1; i < n; i++) {
            int curNum = Integer.parseInt(splitDown[i]);
            int preVal = Integer.parseInt(splitDown[left]);
            System.out.println("i=" + i + " curNum=" + curNum + " preVal=" + preVal);
            //差值
            int diff = curNum - preVal;
            System.out.println(" m=" + m + " diff=" + diff);
            if (m > 0 && diff >= 0) {
                if (m > diff*i) {
                    m -= diff*i;
                    //如果在循环中就可以用完木料,则直接输出
//                    if (m == 0) {
//                        //取出 preVal + m/i
//                        System.out.println(preVal + diff/i);
//                        break;
//                    }
                }else {
                    System.out.println(" i=" + i + " sum ="+ sum + " total=" + total);
                    System.out.println((sum + total) / i);
                    //将m置0
                    break;
                }
            }
            sum += curNum;
            //左指针右移
            left++;
        }
        //如果指针跑完整个数组,木料都还有多的,趣最大值 + m/n, 比如 最大值是5, m还剩余7
        if (total > sum) {
            System.out.println(" sum=" + sum);

        System.out.println((sum + total) / n);
    }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值