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;
}
posted @ 2017-06-19 14:41  ojnQ  阅读(227)  评论(0编辑  收藏  举报