(水)贪心
题目链接
题目大意
给出两个数字序列,从这两个序列中分别选取相同数量的元素进行一对一相乘,问能得到的乘积之和最大为多少
思路
贪心。把这两个序列都从小到大(从大到小)排序,将前面都是负数(正数)的数相乘求和,然后将后面都是正数(负数)的数相乘求和
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;
}