PAT Advanced 1037 Magic Coupon (25) [贪⼼算法]
题目
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
题目分析
- 每张卡券上都有一个整数N(N可能是正,也可能是负)
- 商品分为两种,一种正整数标记的(记为GP,价值记为VGP),另一种负整数标记的(BP,价值记为VBP)
- 卡券(其上数字为N)使用在商品上
- 使用在普通商品GP上,可获得N*VGP的金额
- 使用在BP商品上
- 如果N>0,需支付N*VBP金额
- 如果N<0,可获得N*VBP金额
- 寻找获得最多金币的办法
- 每个优惠券和每个产品最多可以被选择一次
解题思路
- 如果要获得最多金币,必须将大正整数N用在大VGP商品上(正正),将小负整数N用在小VBP商品上(负负)
- 所有卡券排序(从小到大),所有商品排序(从小到大)
- 从左边开始处理卡券和商品均负整数的情况,从右边开始处理卡券和商品均正整数的情况
- 0可以不考虑,因为0乘以任何数都为0,不影响结果
- 可能有部分优惠券和产品不会被选择
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) [贪⼼算法]的更多相关文章
- PAT 甲级 1037 Magic Coupon (25 分) (较简单,贪心)
1037 Magic Coupon (25 分) The magic shop in Mars is offering some magic coupons. Each coupon has an ...
- PAT (Advanced Level) 1037. Magic Coupon (25)
简单题. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> ...
- PAT甲题题解-1037. Magic Coupon (25)-贪心,水
题目说了那么多,就是给你两个序列,分别选取元素进行一对一相乘,求得到的最大乘积. 将两个序列的正和负数分开,排个序,然后分别将正1和正2前面的相乘,负1和负2前面的相乘,累加和即可. #include ...
- 【PAT甲级】1037 Magic Coupon (25 分)
题意: 输入一个正整数N(<=1e5),接下来输入N个整数.再输入一个正整数M(<=1e5),接下来输入M个整数.每次可以从两组数中各取一个,求最大的两个数的乘积的和. AAAAAccep ...
- PAT 甲级 1037 Magic Coupon
https://pintia.cn/problem-sets/994805342720868352/problems/994805451374313472 The magic shop in Mars ...
- 1037 Magic Coupon (25分)
The magic shop in Mars is offering some magic coupons. Each coupon has an integer N printed on it, m ...
- 1037. Magic Coupon (25)
#include<iostream> #include<vector> #include<stdio.h> #include<algorithm> us ...
- 1037 Magic Coupon (25 分)
1037 Magic Coupon (25 分) The magic shop in Mars is offering some magic coupons. Each coupon has an i ...
- PAT 1037 Magic Coupon[dp]
1037 Magic Coupon(25 分) The magic shop in Mars is offering some magic coupons. Each coupon has an in ...
随机推荐
- EUI库 - EXML
EXML是可以运行时加载解析的 <e:Skin class="skins.ButtonSkin" states="up,down,disabled&qu ...
- Egret Engine 2D - 项目配置
todo 看三个示例项目的完整源码和资源 <e:Group name="Button" height = "300" verticalCent ...
- SQL约束攻击
本文转载自https://blog.csdn.net/kkr3584/article/details/69223010 目前值得高兴的是,开发者在建立网站时,已经开始关注安全问题了--几乎每个开发者都 ...
- LIS是什么?【通讯】
Ⅲ最后一点,通讯. 从字面意义来看,通讯是一种沟通形式,信息交互的媒介.在LIS中,通讯主要指的是仪器通讯,也就是仪器与电脑-LIS系统的信息交互方式,也可以称为仪器接口. 在LIS中,通讯是最基础也 ...
- Flink并行度
并行执行 本节介绍如何在Flink中配置程序的并行执行.FLink程序由多个任务(转换/操作符.数据源和sinks)组成.任务被分成多个并行实例来执行,每个并行实例处理任务的输入数据的子集.任务的并行 ...
- 【数据库】MyQSL数据完整性
不知道怎么取标题,简单提一下数据库的完整性实现问题 在MySQL中一种不用写trigger也可以实现级联的方式——直接使用外键实现参照完整性(当然trigger的功能不只是实现级联修改/删除,还可以实 ...
- Ubuntu 不插优盘无法启动
ubuntu安装成功后只能通过优盘启动 不插优盘就无法启动 启动后拔掉优盘没问题 难道动过优盘安装的 2013-06-16 20:01 提问者悬赏:5分 | 理电池 | 分类:电脑外接设备 | 浏览2 ...
- CTF-域渗透--HTTP服务--命令注入2
开门见山 1. 启动metasploit 2. 设置参数参数选项 3. 查看最后设置后的结果 4. 启动监听 5. 使用msfvemon制作webshell 6. 开启apache服务 7. 使用ba ...
- composer命令卡慢,使用国内源
执行composer install.update 和require的时候,遇到卡住不动的情况,可以切换到国内阿里云的源 composer config -g repo.packagist compo ...
- WOJ 1546 Maze 图论上的状态压缩DP
http://acm.whu.edu.cn/land/problem/detail?problem_id=1546 这个题目还是聪哥教的方法过的 首先搜索是必须的,而且通过搜索来缩点,这些应该要想到, ...