题目说了那么多,就是给你两个序列,分别选取元素进行一对一相乘,求得到的最大乘积。
将两个序列的正和负数分开,排个序,然后分别将正1和正2前面的相乘,负1和负2前面的相乘,累加和即可。


#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <cmath> #include <vector> using namespace std; const int maxn=100000+5; int coupon1[maxn]; int c1; int coupon2[maxn]; int c2; int product1[maxn]; int product2[maxn]; int p1,p2;bool cmp(int a,int b){return a>b; } int main() {int nc,np;long long tmp;c1=c2=p1=p2=0;scanf("%d",&nc);for(int i=0;i<nc;i++){scanf("%lld",&tmp);if(tmp>=0)coupon1[c1++]=tmp;elsecoupon2[c2++]=tmp;}scanf("%d",&np);for(int i=0;i<np;i++){scanf("%lld",&tmp);if(tmp>=0)product1[p1++]=tmp;elseproduct2[p2++]=tmp;}long long ans=0;sort(coupon1,coupon1+c1,cmp);sort(product1,product1+p1,cmp);sort(coupon2,coupon2+c2);sort(product2,product2+p2);int min1=min(c1,p1);for(int i=0;i<min1;i++){ans+=coupon1[i]*product1[i];}int min2=min(c2,p2);for(int i=0;i<min2;i++){ans+=coupon2[i]*product2[i];}printf("%lld\n",ans);return 0; }