题目链接:1037 Magic Coupon
题目大意:
神奇的优惠券
火星上有个魔法商店,你可以用优惠券兑换商品,优惠券上标注了倍数,商品上标注了价格,神奇之处在于倍数有负数,价格也有负数。
如果你用优惠券兑换商品,他会按照商品价格给你优惠券给你优惠券上注明的倍数的钱。unfortunately,如果用用了负数券,或者兑换了负数价格商品,那你还得倒贴钱(好像买东西本来就应该付钱啊喂!),但是幸运的是,你可以用负数券换负数商品呀~他还是会给你钱,因为负负得正嘛(你可真是个小机灵鬼)
你的任务:白嫖到尽可能多的钱。
思路:
用最大倍数换最大价格的商品,负数同理,最负的倍数换最负的商品。
因此先对两段进行排序。sort时间复杂度O(nlog2n)。
再从前向后,从后向前,将同号的倍数与价格想乘,记录到结果中。时间复杂度O(n)。
整体时间复杂度O(nlog2n)。
代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
int n, a, ans = 0;
vector<int> v[2];
for(int i = 0; i < 2; i++){
cin >> n;
for(int j = 0; j < n; j++){
scanf("%d", &a);
v[i].push_back(a);
}
sort(v[i].begin(), v[i].end());
}
auto p = v[0].begin(), q = v[1].begin();
while(*p < 0 && *q < 0) ans += *p++ * *q++;
p = v[0].end();
q = v[1].end();
while(*(--p) > 0 && *(--q) > 0) ans += *p * *q;
printf("%d", ans);
}