首页 > 代码库 > 最小乘积(基本型)

最小乘积(基本型)

问题描述
  给两组数,各n个。
  请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小。要求程序输出这个最小值。
  例如两组数分别为:1 3  -5和-2 4 1

  那么对应乘积取和的最小值应为:
  (-5) * 4 + 3 * (-2) + 1 * 1 = -25
输入格式
  第一个行一个数T表示数据组数。后面每组数据,先读入一个n,接下来两行每行n个数,每个数的绝对值小于等于1000。
  n<=8,T<=1000
输出格式
  一个数表示答案。
样例输入
2
3
1 3 -5
-2 4 1
5
1 2 3 4 5
1 0 1 0 1
样例输出
-25
6
 
 
#include"stdio.h"

void swap(int *a,int *b){
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

void maxSort(int a[],int n){
    int i,j;
    for(i=0;i<n;i++)
        for(j=i;j<n;j++){
            int temp;
            if(a[i]<a[j])
                swap(&a[i],&a[j]);
        }
}

void minSort(int a[],int n){
    int i,j;
    for(i=0;i<n;i++)
        for(j=i;j<n;j++){
            if(a[i]>a[j])
                swap(&a[i],&a[j]);
        }
}

int main()
{
    int T;
    int i,j;
    int n;
    int sum[1000];
    scanf("%d",&T);

    for(i=0;i<T;i++)
    {
        sum[i]=0;
        scanf("%d",&n);
        int a[2][10];
        for(j=0;j<n;j++)
            scanf("%d",&a[0][j]);
        for(j=0;j<n;j++)
            scanf("%d",&a[1][j]);
        maxSort(a[0],n);
        minSort(a[1],n);

        for(j=0;j<n;j++)
            sum[i]+=(a[0][j]*a[1][j]);
        
    }
    for(i=0;i<T;i++)
            printf("%d\n",sum[i]);
    return 0;
}
View Code