Q32、(数组、规划)
来源:互联网 发布:如何获取大数据 编辑:程序博客网 时间:2024/05/16 04:05
有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;
要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小。
例如:
var a=[100,99,98,1,2,3];var b=[1,2,3,4,5,40];
思路:
假设序列a和b的和分别为sumA和sumB,假设sumA>sumB。
交换a中的x和b中的y,交换之后得到的差为:
sumA-x+y-(sumB-y+x) = sumA-sumB-2(x-y)
如果要求差最小,那么abs(sumA-sumB-2(x-y))要最小,也就是x-y要更接近于0.5*(sumA-sumB)
如果一次遍历之后数组没有交换,说明当前交换任何一组数据都会使差增大,循环终止
public class Q32_Notice {public static int Sum(int[] a){int sum = 0;for(int i = 0;i<a.length;i++)sum += a[i];return sum;}public static void getMinDiffer(int[] a,int[] b){int[] big = {};int[] small = {};int differ = 0,min;int i,j,suma,sumb;int flag = 1;while(flag == 1){flag = 0;int ai = 0;int bj = 0;suma = Sum(a);sumb = Sum(b);if(suma == sumb)break;else if(suma > sumb){big = a;small = b;differ = suma - sumb;}else if(suma < sumb){big = b;small = a;differ = sumb - suma;}min = differ;for(i = 0;i< big.length;i++)for(j = 0;j<small.length;j++){int temp = big[i] - small[j];if(Math.abs(differ-2*temp)<min){min = Math.abs(differ-2*temp);flag = 1;ai = i;bj = j;}}if(flag == 1){int mid = big[ai];big[ai] = small[bj];small[bj] = mid;}}}public static void main(String[] args) {int[] a = {100,99,98,1,2,3};int[] b = {1,2,3,4,5,40};getMinDiffer(a, b);System.out.println(Arrays.toString(a));System.out.println(Arrays.toString(b));System.out.println(Sum(a)-Sum(b));}}
- Q32、(数组、规划)
- NO_32(数组、规划)
- 【剑指offer】Q32:从1到n整数1出现的次数(python)
- 1119. Metro(动态规划,滚动数组)
- 数组分割(动态规划问题)
- 最大子数组之和(动态规划)
- 数组单调和(动态规划问题)
- 最短排序数组(动态规划)
- 动态规划+使用数组
- 最大连续子数组(分治法、动态规划)
- 最大子数组问题(动态规划)--【算法导论】
- 编程之美 2.18:数组分割 (涉及 动态规划)
- HDU ACM 1513 Palindrome->动态规划(滚动数组)
- 求最大子数组的和(动态规划法)
- 二维数组最大面积的问题(动态规划)
- nyoj--1184--为了肾六(动态规划+滚动数组)
- hdu1231 连续子数组最大和(分治,动态规划)
- 滚动数组算法 --- DP思想(动态规划)
- alter session set events
- Q30、在从 1 到 n 的正数中 1 出现的次数(数组)
- Linux监控工具vmstat命令详解
- vs2010转vs008
- Oracle表空间(tablespaces)
- Q32、(数组、规划)
- Analytics and the ‘Internet of Things’
- 在Dropbox上托管Git私有库
- 局域网客户机连接打印服务器重复出现打印故障之账号问题篇
- UML_main
- 关于问题
- Python编程语言介绍
- MySQL运行状况查询方式
- WebViewClient+WebChromeClient(回调方法)