- 论坛徽章:
- 0
|
以下思路如何, 先把a,b合成一个2n的数组C, 然后按照如下规则选取。
1. a[0] = c [2n-1], b[0] = c[2n-2]
2. 按照suma>sumb, 取剩下的最大的给b,最小的给a; 反之最大的给a,最小的给b。
程序如下:
#include <stdio.h>
#include <stdlib.h>
static int
intcompare(const void *p1, const void *p2)
{
int i = *((int *)p1);
int j = *((int *)p2);
if (i > j)
return (1);
if (i < j)
return (-1);
return (0);
}
int change(int *a, int *b, int size)
{
int *c = (int*) malloc(2*size);
int pos_a,pos_b,pos_c,pos_cend;
int sum_a,sum_b;
int i;
memcpy(c, a, sizeof(int)*size);
memcpy(c+size, b, sizeof(int)*size);
qsort((void *)c, 2*size, sizeof (int), intcompare);
pos_a=pos_b=pos_c=0;
pos_cend = 2*size-1;
a[pos_a++] = c[pos_cend--];
b[pos_b++] = c[pos_cend--];
sum_a = a[0];
sum_b = b[0];
while (pos_cend > pos_c ) {
if (sum_a > sum_b) {
a[pos_a++] = c[pos_c++];
b[pos_b++] = c[pos_cend--];
sum_a += a[pos_a-1];
sum_b += b[pos_b-1];
} else {
a[pos_a++] = c[pos_cend--];
b[pos_b++] = c[pos_c++];
sum_a += a[pos_a-1];
sum_b += b[pos_b-1];
}
}
}
int main (int argc, char **argv)
{
int a[6]= {1, 2, 3,4,5,6};
int b[6]= {7, 8, 9,10,11,12};
int i;
change(a,b,6);
printf("a=");
for(i=0; i <6; i++)
printf("%d,",a[i]);
printf("\n");
printf("b=");
for(i=0; i< 6; i++)
printf("%d,", b[i]);
printf("\n");
} |
|