[PAT] A1037 Magic Coupon

(水)贪心
题目链接

题目大意

给出两个数字序列,从这两个序列中分别选取相同数量的元素进行一对一相乘,问能得到的乘积之和最大为多少

思路

贪心。把这两个序列都从小到大(从大到小)排序,将前面都是负数(正数)的数相乘求和,然后将后面都是正数(负数)的数相乘求和

tips

输入long long int 型数据:
scanf("%lld",&a);

AC代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 100002
bool cmp(int a, int b) {
    return a > b;
}
int main() {
    long long int a[MAX], b[MAX];
    int n1, n2;
    int i;
    scanf("%d", &n1);
    for (i = 0;i < n1;i++)
        scanf("%lld", &a[i]);
    sort(a, a + n1, cmp);
    scanf("%d", &n2);
    for (i = 0;i < n2;i++)
        scanf("%lld", &b[i]);
    sort(b, b + n2, cmp);
    long long ans = 0;
    i = 0;
    while (a[i] > 0 && b[i] > 0 && i < n1 && i < n2) {
        ans += a[i] * b[i];
        i++;
    }
    i = n1 - 1;
    while (a[i] < 0 && b[i - (n1 - n2)] < 0 && i >= 0 && i - (n1 - n2) >= 0) {
        ans += a[i] * b[i - (n1 - n2)];
        i--;
    }
    printf("%ld", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/yue36/p/13272512.html