题意:
两个向量,每一个向量可以调整数字的排列位置,现在问两个向量最小的积是多少。
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; }