其实就是求两个向量的最小内乘积
贪心法:向量一从小到大排序,向量二从大到小排序,相乘积之和最小
#include<iostream>
#include<cstdio>
#include<fstream>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#define MAX 100
#define INF 10000000
using namespace std;
int v1[MAX];
int v2[MAX];
int n;
//排序规则
bool Cmp(int x, int y){
return x > y;
}
//贪心算法
int Mini(){
//排序 最小的乘最大的
int res = 0;
sort(v1, v1+n);
sort(v2, v2+n, Cmp);
for(int i=0; i<n; i++)
res += v1[i] * v2[i];
return res;
}
//测试函数
int main(){
ifstream in ("D:\\钢铁程序员\\程序数据\\987Minimum Scalar Product.txt");
if(!in){
cout << "ERROR" << endl ;
return 0;
}
int c;
in >> c;
while(c--){
in >> n;
for(int i=0; i<n; i++)
in >> v1[i];
for(int i=0; i<n; i++)
in >> v2[i];
cout << Mini() << endl;
}
in.close();
return 0;
}