- 论坛徽章:
- 0
|
我感觉没大家说的那么复杂吧!
因为a,b数组可以交换数据,而且数组长度相等,那么就有:
1:输入a,b数组后把他们放到一个临时数组c里面,对c进行递增排序
2:然后取c最大和最小的放到a里面,然后取次最大和次最小的放到b里面
3:循环第二步即可
下面是我的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<stdbool.h>
int comp1(const void *a,const void *b){
return(*(int *)a-*(int *)b);
}
int main()
{
int n,i,j,t=0,y1=-1,y2=-1,suma=0,sumb=0;
bool flag=true;
printf("输入N的大小:");
scanf("%d",&n);
int* a=malloc(n*sizeof(int));
int* b=malloc(n*sizeof(int));
int* c=malloc(2*n*sizeof(int));
printf("输入数组a:");
for(i=0;i<n;i++){
scanf("%d",a+i);
c[t++]=a[i];
}
printf("输入数组b:");
for( i=0;i<n;i++){
scanf("%d",&b[i]);
c[t++]=b[i];
}
t--;
qsort(c,2*n,sizeof(int),comp1);
if(n%2==0){
for( i=0;i<n;i++){
if(flag){
a[++y1]=c[i];suma+=a[y1];
a[++y1]=c[2*n-1-i];suma+=a[y1];
flag=false;
}
else{
b[++y2]=c[i];sumb+=b[y2];
b[++y2]=c[2*n-1-i];sumb+=b[y2];
flag=true;
}
}
}
else{
for( i=0;i<n-1;i++){
if(flag){
a[++y1]=c[i];suma+=a[y1];
a[++y1]=c[2*n-1-i];suma+=a[y1];
flag=false;
}
else{
b[++y2]=c[i];sumb+=b[y2];
b[++y2]=c[2*n-1-i];sumb+=b[y2];
flag=true;
}
}
if(suma<=sumb){
a[++y1]=c[n];suma+=a[y1];
b[++y2]=c[n-1];sumb+=b[y2];
}
else{
a[++y1]=c[n-1];suma+=a[y1];
b[++y2]=c[n];sumb+=b[y2];
}
}
printf("数组c:");
for(i=0;i<2*n;i++)
printf("%d ",c[i]);
printf("\n");
printf("数组a:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
printf("数组b:");
for(i=0;i<n;i++)
printf("%d ",b[i]);
printf("\n");
printf("数组a的和:");
printf("%d\n",suma);
printf("数组b的和:");
printf("%d\n",sumb);
printf("数组a和b的最小差为:");
printf("%d\n",abs(suma-sumb));
return 0;
}
不知道对不对,反正我的思路是这样,因为他们能互相交换,总能取得这样的解 |
|