PAT甲级1037.

目录

A1037

题目

样例

输入:

4
1 2 4 -1
4
7 6 -2 -3

输出:

43

思路和坑点

  正数和正数的最大值相乘,负数和负数的最小值相乘(负负得正,负数越小,绝对值越大)。然后,把每一种情况累计求和即可。
  把每组的正数和负数分别存放,0忽略不计,因为0乘任何数都是0.注意两组的长度可能不同,所以注意数组不要越界。

AC代码

#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
    return a>b;
}
int main(void){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt","r",stdin);
#endif
    vector<int> az,af,bz,bf;
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){            //正数和负数分开存储 
        int temp;
        scanf("%d",&temp);
        if(temp<0)
            af.push_back(temp);
        else if(temp>0)
            az.push_back(temp);
    }
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int temp;
        scanf("%d",&temp);
        if(temp<0)
            bf.push_back(temp);
        else if(temp>0)
            bz.push_back(temp);
    }
    //正数从大到小排列,负数从小到大排列 
    sort(az.begin(),az.end(),cmp);sort(af.begin(),af.end());
    sort(bz.begin(),bz.end(),cmp);sort(bf.begin(),bf.end());
    int sum=0;
    for(int i=0;i<az.size()&&i<bz.size();i++){        //累加求和 
        sum+=az[i]*bz[i];
    }
    for(int i=0;i<af.size()&&i<bf.size();i++){
        sum+=af[i]*bf[i];
    }
    cout<<sum;
    return 0;
}