[PAT] A1037 Magic Coupon

tech2022-09-03  107

(水)贪心 题目链接

题目大意

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

思路

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

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; }
最新回复(0)