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))
O(n∗log(n))
Space complexity :
O
(
n
)
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]));
}
}