题目

The magic shop in Mars is ofering 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 ofers 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 M7) to get M28 back; coupon 2 to product 2 to get M12 back; and coupon 4 to product 4 to get M3 back. On the other hand, if you apply coupon 3 to product 4, you will have to pay M12 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 NC,followed by a line with NC coupon integers. Then the next line contains the number of products NP,followed by a line with NP product values. Here 1<= NC,NP<=10^5, and it is guaranteed that all the numbers will not exceed 230.

Output Specification:

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

Sample Input:

4

1 2 4 -1

4

7 6 -2 -3

Sample Output:

43

题目分析

  1. 每张卡券上都有一个整数N(N可能是正,也可能是负)
  2. 商品分为两种,一种正整数标记的(记为GP,价值记为VGP),另一种负整数标记的(BP,价值记为VBP)
  3. 卡券(其上数字为N)使用在商品上
    • 使用在普通商品GP上,可获得N*VGP的金额
    • 使用在BP商品上
      • 如果N>0,需支付N*VBP金额
      • 如果N<0,可获得N*VBP金额
  4. 寻找获得最多金币的办法
  5. 每个优惠券和每个产品最多可以被选择一次

解题思路

  1. 如果要获得最多金币,必须将大正整数N用在大VGP商品上(正正),将小负整数N用在小VBP商品上(负负)
  2. 所有卡券排序(从小到大),所有商品排序(从小到大)
  3. 从左边开始处理卡券和商品均负整数的情况,从右边开始处理卡券和商品均正整数的情况
  4. 0可以不考虑,因为0乘以任何数都为0,不影响结果
  5. 可能有部分优惠券和产品不会被选择

Code

Code 01

#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[]) {
int NC,NP;
scanf("%d",&NC);
int cps[NC]= {0};
for(int i=0; i<NC; i++) scanf("%d",&cps[i]);
scanf("%d",&NP);
int pds[NP]= {0};
for(int i=0; i<NP; i++) scanf("%d",&pds[i]);
sort(cps,cps+NC);
sort(pds,pds+NP);
int ans=0;
for(int i=0,j=0; i<NC&&j<NP&&cps[i]<0&&pds[j]<0; i++,j++) ans+=(cps[i]*pds[j]);
for(int i=NC-1,j=NP-1; i>=0,j>=0&&cps[i]>0&&pds[j]>0; i--,j--) ans+=(cps[i]*pds[j]);
printf("%d",ans);
return 0;
}

PAT Advanced 1037 Magic Coupon (25) [贪⼼算法]的更多相关文章

  1. PAT 甲级 1037 Magic Coupon (25 分) (较简单,贪心)

    1037 Magic Coupon (25 分)   The magic shop in Mars is offering some magic coupons. Each coupon has an ...

  2. PAT (Advanced Level) 1037. Magic Coupon (25)

    简单题. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> ...

  3. PAT甲题题解-1037. Magic Coupon (25)-贪心,水

    题目说了那么多,就是给你两个序列,分别选取元素进行一对一相乘,求得到的最大乘积. 将两个序列的正和负数分开,排个序,然后分别将正1和正2前面的相乘,负1和负2前面的相乘,累加和即可. #include ...

  4. 【PAT甲级】1037 Magic Coupon (25 分)

    题意: 输入一个正整数N(<=1e5),接下来输入N个整数.再输入一个正整数M(<=1e5),接下来输入M个整数.每次可以从两组数中各取一个,求最大的两个数的乘积的和. AAAAAccep ...

  5. PAT 甲级 1037 Magic Coupon

    https://pintia.cn/problem-sets/994805342720868352/problems/994805451374313472 The magic shop in Mars ...

  6. 1037 Magic Coupon (25分)

    The magic shop in Mars is offering some magic coupons. Each coupon has an integer N printed on it, m ...

  7. 1037. Magic Coupon (25)

    #include<iostream> #include<vector> #include<stdio.h> #include<algorithm> us ...

  8. 1037 Magic Coupon (25 分)

    1037 Magic Coupon (25 分) The magic shop in Mars is offering some magic coupons. Each coupon has an i ...

  9. PAT 1037 Magic Coupon[dp]

    1037 Magic Coupon(25 分) The magic shop in Mars is offering some magic coupons. Each coupon has an in ...

随机推荐

  1. 168-PHP 输出系统当前时间

    <body style="font-family:'华文彩云'; color:#0000CC; font-size:20px"> 系统的当前时间是: <?php ...

  2. request.getParameter() 接收参数中文乱码

    修改tomcat配置文件 设置url编码集 <Connector port="8080" protocol="HTTP/1.1" connectionTi ...

  3. 第二阶段scrum-7

    1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 部署云服务器完成,链接数据库完成,消息收发正在制作.

  4. 【Vue中的坑】Vue中的修改变量没有效果?

    使用箭头函数 this.$forceUpdate();

  5. datetime使用

      通过当前日期,获取最近第一个周五.第二个周五.每季度末最后一个周五 def get_current_week(self, symbol: str, start_date: datetime): i ...

  6. IBGP(内部BGP)的对等体组(命令解析)

    IBGP(内部BGP)对等体组配置解析: ①:创建对等体组. ②:定义对等体组策略,指定邻居路由器及所在的AS. ③:定义,更新源. ④:(若边界)定义自己下一跳. ⑤:加入对等体组. IBGP(内部 ...

  7. 【转】CSS实现自适应分隔线的N种方法

    1.伪元素+transform:translateX(-100%); 主要原理是设置文本居中text-align: center;,然后给定两个伪元素,分别绝对定位,那么此时伪元素也是跟随着水平居中的 ...

  8. Java多线程通讯---------wait,notify区别

    class Res{ public String username; public String sex; } class Out extends Thread{ Res res; public Ou ...

  9. ubuntu 18.04 安装 Redis-server

    Redis 安装 Redis是一款内存键值存储,以其灵活性,性能和广泛的语言支持而闻名.本教程将演示如何在Ubuntu 18.04服务器上安装和配置Redis.主要内容包括: 安装 Redis Red ...

  10. 远程桌面,出现身份验证错误,要求的函数不正确,这可能是由于CredSSP加密Oracle修正

    问题点: 升级至win10 最新版本10.0.17134,安装最新补丁后无法远程win server 2016服务器,报错信息如下: 出现身份验证错误,要求的函数不正确,这可能是由于CredSSP加密 ...