有两个序列a,b,大小都有n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b无素的和]之间的差最小。
例如:
var a = [100, 99, 98, 1, 2, 3];
var b = [1, 2, 3, 4, 5, 40];
参考答案:
#include
using namespace std;
int comparer(const void* number1, const void* number2)
{
return *(int*)number1 – *(int*)number2;
}
void rearrange(int* a, int* b, int n)
{
int i = 0;
int j = 0;
int k = 0;
int* c = new int[2 * n];
qsort(a, n, sizeof(int), comparer);
qsort(b, n, sizeof(int), comparer);
while(i < n && j < n)
{
if(*(a + i) < *(b + j))
{
*(c + k) = *(a + i);
++k;
++i;
}
else
{
*(c + k) = *(b + j);
++k;
++j;
}
}
while(i < n)
{
*(c + k) = *(a + i);
++k;
++i;
}
while(j < n)
{
*(c + k) = *(b + j);
++k;
++j;
}
for(int i = 0; i < 2 * n; ++i)
{
cout << *(c + i) << ” “;
}
cout << endl;
int flag = flag = *(c + 0) – *(c + 1);
for(int i = 0; i < n; ++i)
{
if(flag >= 0)
{
*(a + i) = *(c + 2 * i);
*(b + i) = *(c + 2 * i + 1);
}
else
{
*(a + i) = *(c + 2 * i + 1);
*(b + i) = *(c + 2 * i);
}
flag = *(a + i) – *(b + i);
}
delete[] c;
}
int main(int argc, char** argv)
{
int sum_a = 0;
int sum_b = 0;
int a[] = {100, 99, 98, 1, 2, 3};
int b[] = {1, 2, 3, 4, 5, 40};
rearrange(a, b, 6);
for(int i = 0; i < 6; ++i)
{
sum_a += *(a + i);
cout << *(a + i) << ” “;
}
cout << endl;
for(int i = 0; i < 6; ++i)
{
sum_b += *(b + i);
cout << *(b + i) << ” “;
}
cout << endl;
if(sum_a – sum_b > 0)
{
cout << “the smallest difference is ” << sum_a – sum_b << endl;
}
else
{
cout << “the smallest difference is ” << sum_b – sum_a << endl;
}
return 0;
}