PAT 甲级 1037 Magic Coupon
发布日期:2021-07-01 03:09:05 浏览次数:3 分类:技术文章

本文共 2099 字,大约阅读时间需要 6 分钟。

1037 Magic Coupon (25 point(s))

The magic shop in Mars is offering some magic coupons. Each coupon has an integer N printed on it, meaning that when you use this coupon with a product, you may get N times the value of that product back! What is more, the shop also offers some bonus product for free. However, if you apply a coupon with a positive N to this bonus product, you will have to pay the shop N times the value of the bonus product... but hey, magically, they have some coupons with negative N's!

For example, given a set of coupons { 1 2 4 −1 }, and a set of product values { 7 6 −2 −3 } (in Mars dollars M$) where a negative value corresponds to a bonus product. You can apply coupon 3 (with N being 4) to product 1 (with value M$7) to get M$28 back; coupon 2 to product 2 to get M$12 back; and coupon 4 to product 4 to get M$3 back. On the other hand, if you apply coupon 3 to product 4, you will have to pay M$12 to the shop.

Each coupon and each product may be selected at most once. Your task is to get as much money back as possible.

Input Specification:

Each input file contains one test case. For each case, the first line contains the number of coupons N​C​​, followed by a line with N​C​​ coupon integers. Then the next line contains the number of products N​P​​, followed by a line with N​P​​ product values. Here 1≤N​C​​,N​P​​≤10​5​​, and it is guaranteed that all the numbers will not exceed 2​30​​.

Output Specification:

For each test case, simply print in a line the maximum amount of money you can get back.

Sample Input:

41 2 4 -147 6 -2 -3

Sample Output:

43

经验总结:

这一题,使用的是贪心算法,两个数组排一下序(这里设为从小到大),然后按顺序,从左边两个数组都是负数的话就相乘并且加入收益,从右边两个都是正数就相乘并且加入收益,只要不满足条件就跳出,最终算出结果就行啦~注意最终结果要用long long 存储,毕竟题目说所有数不大于2^30,两个2^30相乘就2^60多了,注意一点就行~

AC代码:

#include 
#include
#include
using namespace std;const int maxn=100010;int c[maxn],p[maxn];int main(){ long long ans=0; int nc,np; scanf("%d",&nc); for(int i=0;i
np?np:nc; for(int i=0;i
=0&&j>=0) { if(c[i]>0&&p[j]>0) ans+=(long long)c[i]*p[j]; else break; --i;--j; } printf("%lld\n",ans); return 0;}

 

转载地址:https://meteorrain.blog.csdn.net/article/details/86619397 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:PAT 甲级 1038 Recover the Smallest Number
下一篇:PAT 甲级 1036 Boys vs Girls

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月27日 06时55分52秒