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;
}

转载于:https://www.cnblogs.com/WArobot/p/7048607.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值