题目链接:https://www.patest.cn/contests/pat-a-practise/1037
题目大意:给两个数列A和B,A、B中格挑一个元素相乘,一直重复此动作,每个元素只能用一次,把每次的乘积累加,计算所能达到的最大和。
解题思路:
- 先将两个数列排序
- 分别计算所有的负数*负数和正数*正数
- 累加起来
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char const *argv[])
{
int nc,np;
cin>>nc;
int ncnums[nc];
//输入两nc数组
for(int i=0;i<nc;i++){
cin>>ncnums[i];
}
cin>>np;
//输入np数组
int npnums[np];
for(int i=0;i<np;i++){
cin>>npnums[i];
}
//将两个数组排序
sort(ncnums,ncnums+nc);
sort(npnums,npnums+np);
int res=0,p,q;
//先计算所有的负数*负数
for(p=0,q=0;p<nc&&q<np&&ncnums[p]<0&&npnums[q]<0;p++,q++){
res+=ncnums[p]*npnums[q];
}
//再计算所有的正数*正数
for(p=nc-1,q=np-1;p>=0&&q>=0&&ncnums[p]>0&&npnums[q]>0;p--,q--){
res+=ncnums[p]*npnums[q];
}
cout<<res<<endl;
return 0;
}