交换两数组中的元素使得这两个数组的差最小
程序员文章站
2024-02-03 11:20:58
...
交换两数组中的元素使得这两个数组的差最小
a1=A-B
a2=(A-a[i]+b[j])-(B-b[j]=a[i])
=(A-B)-2*(a[i]-b[j])
=a1-2*(a[i]-b[j])
a[i]-b[j]~~(0,a1) min=a1/2;
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<string>
using namespace std;
void swap(float *A, int lenA, float *B, int lenB, float a1)
{
float min_ = 10000;
int k1 = -1;
int k2 = -1;
for (int i = 0; i < lenA;i++)
for (int j = 0; j < lenB; j++){
int sub = abs((A[i] - B[j])-a1*1.0/2);
if (sub < min_)
{
min_ = sub;
k1 = i;
k2 = j;
}
}
int temp = A[k1];
A[k1] = B[k2];
B[k2] = temp;
}
float FinSum(float A[], int lenA, float B[], int lenB)
{
float Subsum1 = 0;
float Subsum2 = 0;
for (int i = 0; i < lenA; i++)
{
Subsum1 += A[i];
}
for (int i = 0; i < lenA; i++)
{
Subsum2 += B[i];
}
float a1 = Subsum1 - Subsum2;
return a1;
}
int main()
{
float A[] = { 4,5,6 };
int len_a = 3;
float B[] = { 1,2,3};
int len_b = 3;
float a1 = 1000000;
float a2 = FinSum(A, len_a, B, len_b);
while (a2 < a1)
{
a1 = a2;
swap(A, len_a, B, len_b, a2);
a2 = FinSum(A, len_a, B, len_b);
}
return 0;
}
推荐阅读
-
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%100000000...
-
交换两数组中的元素使得这两个数组的差最小
-
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。
-
快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
-
go语言实现--找出一个数组中的两个数,这两个数之和等于一个给定的值
-
一个整形数组中除了两个数字外,其它的数字都出现了两次,将这两个数字打印出来
-
快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
-
怎的快速找出两个数组中相同的元素
-
【VBA】自定义函数,将数组中的元素连接起来(可以每个元素两边分别加字符)
-
找出两个数组中不同的元素