交換兩序列a,b中的元素,使序列a的和與序列b的和之間的差值最小

來源:互聯網
上載者:User

參考網址:http://blog.csdn.net/v_JULY_v/article/details/6126444 第32題

問題描述:

有兩個序列a,b,大小都為n,序列元素的值任意整數,無序;
要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小

代碼實現:

#include <cstdio>#include <cstdlib>#include <cmath>void swapi(int *x, int *y);int sum(int a[], int n);int isXinA(int x, int A);void process(int a[], int b[], int n);int main(){int a[] = {1, 2, 3, 29, 30};int b[] = {1, 210, 232, 12311, 12312};int n = 5;process(a, b, n);for (int i = 0; i < n; i++)printf("%d  ", a[i]);printf("\n");for (int i = 0; i < n; i++)printf("%d  ", b[i]);printf("\n%d\n", abs(sum(a, n)- sum(b, n)));system("pause");return 0;}void swapi(int *x, int *y){int temp = *x;*x = *y;*y = temp;}int sum(int a[], int n){int ret = 0;for (int i = 0; i < n; i++)ret += a[i];return ret;}int isXinA(int x, int A){if ((x>0 && x<A) || (x>A && x<0))return 0;return 1;}void process(int a[], int b[], int n){int sum_a = sum(a, n);int sum_b = sum(b, n);int A = sum_a - sum_b;float minValue = abs(a[0]-b[0] - A/2.0);int ii = 0, jj = 0;int flag = 0;if (A == 0)return;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){int x = a[i] - b[j];if (x == 0)continue;if (isXinA(x, A) == 0){float temp = (float)abs(a[i]-b[j] - A/2.0);if (temp < minValue){minValue = temp;ii = i;jj = j;flag = 1;}}}}if (flag == 1){swapi(&a[ii], &b[jj]);process(a, b, n);//繼續求解}}//求解思路://當前數組a和數組b的和之差為//A = sum(a) - sum(b)////a的第i個元素和b的第j個元素交換後,a和b的和之差為//A' = sum(a) - a[i] + b[j] - (sum(b) - b[j] + a[i])// = sum(a) - sum(b) - 2 (a[i] - b[j])//   = A - 2 (a[i] - b[j])////設x = a[i] - b[j]//|A| - |A'| = |A| - |A-2x|////假設A > 0,//當x 在 (0,A)之間時,做這樣的交換才能使得交換後的a和b的和之差變小,//x越接近A/2效果越好,//如果找不到在(0,A)之間的x,則當前的a和b就是答案。////所以演算法大概如下://在a和b中尋找使得x在(0,A)之間並且最接近A/2的i和j,交換相應的i和j元素,//重新計算A後,重複前面的步驟直至找不到(0,A)之間的x為止。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.