牛客网 2018校招真题 爱奇艺 拼凑正方形

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32767041/article/details/86514296

Description

牛客网 2018校招真题 拼凑正方形

Solving Ideas

为了四根木棍长度变成一样同时支付的硬币最少,我们不妨先将长度排序,假设排序后在数轴上的位置如下:
---a-----b-----c-----d---
那么其实 四根木棍最后长度都变成[b, …, c] (b <= c)中的任意一个值都能得到最优解
假设最优解为x,通过分析x在数轴上的位置可以得到上面的结论:

  • 若x位于[a, b),如
    ---a--x--b-----c-----d---
  • 若x位于[b, c],如
    ---a-----b--x--c-----d---
  • 若x位于(c, d],如
    ---a-----b-----c--x--d---

因为这些数字都是在数轴上的,通过分析可以知道,当a<=x<=d时,不管x处于a和d之间的哪个点上,x与a、d的距离之和总是不变的且等于d-a,所以最终影响结果的是x与b、c之间的距离。

类似与x与a、d的关系,当b<=x<=c时,不管x处于b和c之间的哪个点上(甚至与b或c重合),x与b、c的距离之和总是不变的且等于c-b;而当x位于[a, b)或(c, d]时,都会使x到b、c的距离增大,从而使最终结果也增大。

由此,我们可以得出结论需要支付最少的硬币为(d-a) + (c-b)

推广到n根木棍:
当n为奇数时,x = 数组排序后中间元素的值
当n为偶数时,x = 数组排序后中间两个元素之间的任意值

Time complexity : O ( n l o g ( n ) ) O(n*log(n))
Space complexity : O ( n ) O(n)
n为数组长度

Solution

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

/**
 * https://blog.csdn.net/qq_32767041/article/details/86514296
 * @author wylu
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] strs = br.readLine().split(" ");
        int[] a = new int[strs.length];
        for (int i = 0; i < strs.length; i++) a[i] = Integer.parseInt(strs[i]);
        Arrays.sort(a);
        System.out.println((a[3] - a[0]) + (a[2] - a[1]));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32767041/article/details/86514296