1037. Magic Coupon (25)

来源:互联网 发布:棋逢对手 知乎 编辑:程序博客网 时间:2024/06/13 23:37

题目链接: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;}