GCJ 2008 Round 1A Minimum Scalar Product( 水 )
**链接:****传送门 **
题意:给两个向量 v1 = { x1 , x2 , x3 , x4 .... } , v2 = { y1 , y2 , y3 , y4 ...... } 允许任意交换 v1 和 v2 各自向量的分量顺序,计算 v1,v2 内积 ( x1 * y1 + x2 * y2 .... )的最小值
思路:根据样例可大胆猜测内积最小值应该为 v1 的最小值 × v2 的最大值 , v1 的次小值 × v2 的次大值 ...... 也就是需要排两次序即复杂度为 O( nlogn )是可以通过大数据的
/*************************************************************************
> File Name: gcj_2008_round1_A.cpp
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年06月19日 星期一 14时10分49秒
************************************************************************/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAX_N = 1002;
int v1[MAX_N] , v2[MAX_N];
int n;
bool cmp(int a,int b){
return a > b;
}
int main(){
int t , kase = 0;
freopen("A-small-practice.in","r",stdin); // 测试小数据
freopen("A-small-practice.out","w",stdout); // 测试小数据
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i = 0 ; i < n ; i++) scanf("%d",v1+i);
for(int i = 0 ; i < n ; i++) scanf("%d",v2+i);
sort(v1,v1+n);
sort(v2,v2+n,cmp);
ll ret = 0;
for(int i = 0 ; i < n ; i++){
ret += (ll)v1[i]*v2[i];
}
printf("Case #%d: %lld\n",++kase , ret);
}
return 0;
}
如要转载请注明转载出处:http://www.cnblogs.com/WArobot