1037 Magic Coupon
题目大意
寻找对应的数,使其相乘后相加,得到的数为最大值
算法思想
- 这题我看起来很简单,但是好的算法很难想到,最后还是看了柳神的代码,佩服,学到了
- 分别从前往后和从后往前,负数与负数相乘,正数与正数相乘
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n, m, sum = 0;
cin >> n;
vector<int>coupon(n);
for (int i = 0; i < n; i++)
cin >> coupon[i];
cin >> m;
vector<int>product(m);
for (int i = 0; i < m; i++)
cin >> product[i];
sort(coupon.begin(), coupon.end());//从小到大排序
sort(product.begin(), product.end());
for (int i = 0, j = 0; i < n && j < m && coupon[i] < 0 && product[j] < 0; i++, j++) {//从小向大,负数相乘
sum += coupon[i] * product[j];
}
for (int i = n - 1, j = m - 1; i >= 0 && j >= 0 && coupon[i] > 0 && product[j] > 0; i--, j--) {//从大往小,正数依次相乘
sum += coupon[i] * product[j];
}
cout << sum;
return 0;
}