Round 2008 1AA

    xiaoxiao2021-03-25  110

    题意:

    两个向量,每一个向量可以调整数字的排列位置,现在问两个向量最小的积是多少。

    AA: 暴力枚举,顺便用到了next_permutation();

    #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int main() { freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); int t,n; int a[1000],b[1000]; int ncase = 1; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i = 0;i < n; i++) { scanf("%d",&a[i]); } for(int i = 0;i < n; i++) { scanf("%d",&b[i]); } sort(a,a+n); sort(b,b+n); int ans = 0x3f3f3f3f; do { int temp = 0; for(int i = 0;i < n; i++) { temp += a[i]*b[i]; } if(ans > temp) ans = temp; }while(next_permutation(b,b+n)); printf("Case #%d: %d\n",ncase++,ans); } return 0; }

    对于 AB:large,解决方式是:找到存在的规律。 两次排序:最大与最小乘,输出结果,注意要用long long 类型。 这道题告诉我们:方法有很多,主要是看自己的思考方式了。

    #include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef long long LL; LL a[1000],b[1000]; LL ans; int main() { freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); int ncase = 1; int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i = 0;i < n; i++) { scanf("%lld",&a[i]); } for(int i = 0;i < n; i++) { scanf("%lld",&b[i]); } sort(a,a+n); sort(b,b+n); ans = 0; for(int i = 0;i < n; i++) ans += a[i]*b[n-i-1]; printf("Case #%d: %lld\n",ncase++,ans); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-36770.html

    最新回复(0)