问题描述
给两组数,各
n
个。
请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最⼩。要求程序输出
这个最⼩值。
例如两组数分别为
:1 3 -5
和
-2 4 1
那么对应乘积取和的最⼩值应为:
(-5) * 4 + 3 * (-2) + 1 * 1 = -25
输⼊格式
第⼀个⾏⼀个数
T
表示数据组数。后⾯每组数据,先读⼊⼀个
n
,接下来两⾏每⾏
n
个数,每个数的绝
对值⼩于等于
1000
。
n<=1000,T<=10
输出格式
⼀个数表示答案。
样例输⼊
2
3
1 3 -5
-2 4 1
5
1 2 3 4 5
1 0 1 0 1
样例输出
-25
6
从柳婼的思路里得到启发,
让两组数据中其中⼀组升序排列,另⼀组降序排列,让对应下标的数字相乘,最后求和
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string>
#include <set>
#include <queue>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int sum=0;
int m;
cin>>m;
int a[m];
int b[m];
for(int i=0;i<m;i++)
{
cin>>a[i];
}
for(int i=0;i<m;i++)
{
cin>>b[i];
}
sort(a,a+m);//升序
sort(b,b+m,cmp);//降序
for(int i=0;i<m;i++)
{
sum+=a[i]*b[i];
}
cout<<sum<<endl;
}
}