题解:#4448.「2025.03五级」乘积的最大和 审核通过

zswzh 2025-09-13 21:21:15 4

本题是一道贪心,正数和负数分别计算就可以了,注释已经写好了

#include<iostream>
#include<vector>
#include<algorithm>//排序用的头文件

using namespace std;

int main()
{
    int n, m;
    cin >> n;
    vector<long long> a(n);
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    cin >> m;
    vector<long long> b(m);
    for (int i = 0; i < m; i++)
    {
        cin >> b[i];
    }
    vector<long long> a_p, a_g;
    vector<long long> b_p, b_g;
    for (int i = 0; i < n; i++)//a数组
    {
        if (a[i] > 0)//如果是正数,就放进a_g
        {
            a_p.push_back(a[i]);
        }
        else if (a[i] < 0)//如果是负数,就放进a_g
        {
            a_g.push_back(a[i]);
        }
    }
    for (int i = 0; i < m; i++)//b数组
    {
        if (b[i] > 0)//如果是正数,就放进b_g
        {
            b_p.push_back(b[i]);
        }
        else if (b[i] < 0)//如果是负数,就放进b_g
        {
            b_g.push_back(b[i]);
        }
    }
    //正数排序
    sort(a_p.begin(), a_p.end(), greater<long long>());
    sort(b_p.begin(), b_p.end(), greater<long long>());
    //负数排序
    sort(a_g.begin(), a_g.end());
    sort(b_g.begin(), b_g.end());
    long long ans = 0;
    int len_pos = min(a_p.size(), b_p.size());
    //正数与正数相乘
    for (int i = 0; i < len_pos; i++)
    {
        ans += a_p[i] * b_p[i];
    }
    int len_neg = min(a_g.size(), b_g.size());
    //负数与负数相乘
    for (int i = 0; i < len_neg; i++)
    {
        ans += a_g[i] * b_g[i];
    }
    cout << ans << endl;
    return 0;
}
{{ vote && vote.total.up }}