2008 Round1AA Minimum Scalar Product

  • 用贪心法能实现,一个向量正序,一个向量逆序,相乘相加就能解决
  • PS:用__int64时,在printf,scanf里面的格式化字符应该是%I64d,虽然%d也能用,但是如果数值范围过大就会溢出。
#include <cstdio>
#include <algorithm>

//__int64输入输出的时候一定要用%I64d
//否则结果错误

const int MAX_N = 200000; //最大个数
int n;  //总个数
__int64 x[MAX_N], y[MAX_N];

int cmp1(const void *a, const void *b){ //从小到大排序
    return *(__int64 *)a - *(__int64 *)b;
}

int cmp2(const void *a, const void *b){ //从大到小排序
    return *(__int64 *)b - *(__int64 *)a;
}

void solve(int cas){
    qsort(x, n, sizeof(__int64), cmp1);
    qsort(y, n, sizeof(__int64), cmp2);
    __int64 res = 0;
    for(int i = 0; i < n; ++i){
        res += x[i] * y[i];
    }
    printf("Case #%d: %I64d\n", cas, res);
}

int main(){
    freopen("A-large-practice.in","r",stdin);
    freopen("A-large-practice.out","w",stdout);
    int num;
    scanf("%d", &num);
    for(int j = 0; j < num; ++j){
        scanf("%d", &n);
        for(int i = 0; i < n; ++i){
            scanf("%I64d", &x[i]);
        }
        for(int i = 0; i < n; ++i){
            scanf("%I64d", &y[i]);
        }
        solve(j + 1);
    }
    return 0;
}




你可能感兴趣的:(贪心法,向量内积)