题目链接:http://www.patest.cn/contests/ds/7-05

在火星上有个魔法商店,提供魔法优惠券。每一个优惠劵上印有一个整数面值K,表示若你在购买某商品时使用这张优惠劵。能够得到K倍该商品价值的回报!该商店还免费赠送一些有价值的商品,可是假设你在领取免费赠品的时候使用面值为正的优惠劵,则必须倒贴给商店K倍该商品价值的金额…… 可是不要紧,还有面值为负的优惠劵能够用!

(真是奇妙的火星)

比如。给定一组优惠劵。面值分别为1、2、4、-1。相应一组商品。价值为火星币M$7、6、-2、-3,当中负的价值表示该商品是免费赠品。我们能够将优惠劵3用在商品1上,得到M$28的回报;优惠劵2用在商品2上。得到M$12的回报。优惠劵4用在商品4上。得到M$3的回报。

可是假设一不小心把优惠劵3用在商品4上,你必须倒贴给商店 M$12。相同,当你一不小心把优惠劵4用在商品1上。你必须倒贴给商店 M$7。

规定每张优惠券和每件商品都仅仅能最多被使用一次,求你能够得到的最大回报。

输入格式说明:

输入有2行。第1行首先给出优惠劵的个数N。随后给出N个优惠劵的整数面值。第2行首先给出商品的个数M,随后给出M个商品的整数价值。

N和M在[1, 106]之间。全部的数据大小不超过230。数字间以空格分隔。

输出格式说明:

输出能够得到的最大回报。

例子输入与输出:

序号 输入 输出
1
4 1 2 4 -1
4 7 6 -2 -3
43
2
4 3 2 6 1
3 2 6 3
49
3
5 0 0 0 0 -1
4 0 0 0 1
0
4
7 3 36 -1 73 2 3 6
6 -1 -1 -1 -1 -1 -1
1

PS:

先排好序后在从两头一起扫描一遍就好了!

代码例如以下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 1000017;
int a[maxn], b[maxn];
bool cmp(int a, int b)//从大到小
{
return a > b;
}
int main()
{
int n, m;
while(~scanf("%d",&n))
{
int i, j;
for(i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n,cmp);
scanf("%d",&m);
for(i = 0; i < m; i++)
{
scanf("%d",&b[i]);
}
sort(b,b+n,cmp);
int sum = 0;
int l1 = 0, l2 = 0;
int h1 = n-1, h2 = m-1;
for(i = 0; ;i++)
{
if(a[l1]*b[l2] >= 0)//头
{
if(a[l1]*b[l2]==0)
{
if(a[l1]==0)
l1++;
if(b[l2]==0)
l2++;
}
else
{
sum+=a[l1]*b[l2];
l1++;
l2++;
}
}
else if(a[h1]*b[h2] >= 0)//尾
{
if(a[h1]*b[h2] == 0)
{
if(a[h1]==0)
h1--;
if(b[h2]==0)
h2--;
}
else
{
sum+=a[h1]*b[h2];
h1--;
h2--;
}
}
else//都不符合,就不用当前的优惠券
{
l1++;
h1--;
}
if(l1 > h1 || l2 > h2)
break;
}
printf("%d\n",sum);
}
return 0;
}

7-05. 魔法优惠券(25) (数学 ZJU_PAT)的更多相关文章

  1. PTA数据结构与算法题目集(中文) 7-39魔法优惠券 (25 分)

    PTA数据结构与算法题目集(中文)  7-39魔法优惠券 (25 分) 7-39 魔法优惠券 (25 分)   在火星上有个魔法商店,提供魔法优惠券.每个优惠劵上印有一个整数面值K,表示若你在购买某商 ...

  2. 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)

    题目链接:http://pat.zju.edu.cn/contests/ds/3-07 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,比如2+3*(7 ...

  3. 2-08. 用扑克牌计算24点(25) (ZJU_PAT 数学 枚举)

    题目链接:http://pat.zju.edu.cn/contests/ds/2-08 一副扑克牌的每张牌表示一个数(J.Q.K分别表示11.12.13,两个司令都表示6).任取4张牌.即得到4个1~ ...

  4. 3-08. 栈模拟队列(25)(ZJU_PAT 模拟)

    主题链接:http://pat.zju.edu.cn/contests/ds/3-08 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操 ...

  5. PAT Advanced 1024 Palindromic Number (25) [数学问题-⼤整数相加]

    题目 A number that will be the same when it is written forwards or backwards is known as a Palindromic ...

  6. gj3 Python数据模型(魔法函数)

    3.1 什么是魔法函数 类里面,实现某些特性的内置函数,类似 def __xx__(): 的形式. 不要自己定义XX,并不是和某个类挂钩的 class Company(object): def __i ...

  7. 【彩票】彩票预测算法(一):离散型马尔可夫链模型C#实现

    前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. 已经3个月没写博客了,因为业余时间一直在研究彩票,发现还是有很多乐趣,偶尔买买,娱 ...

  8. 【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】

    原文:[年终分享]彩票数据预测算法(一):离散型马尔可夫链模型实现[附C#代码] 前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. ...

  9. java实现哈夫曼编码

    java实现哈夫曼编码 哈夫曼树   既然是学习哈夫曼编码,我们首先需要知道什么是哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫 ...

随机推荐

  1. Rightmost Digit(快速幂+数学知识OR位运算) 分类: 数学 2015-07-03 14:56 4人阅读 评论(0) 收藏

    C - Rightmost Digit Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...

  2. JavaScript-打开新窗口

    open()方法可以查找一个已经存在或者新建一个新的浏览器窗口. 语法:window.open([URL], [窗口名称], [参数字符串]) 参数解释: URL:可选参数,在窗口中显示网页的网址或路 ...

  3. Unity 生命周期

    原文翻译:            Execution Order of Event Functions            事件函数的执行顺序                        Edit ...

  4. 一个web初学者的笔记总结

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px ...

  5. ubuntu 步步为营之uclinux编译和移植(完整版)

    本节主要包含(ubuntu10.04) 一,linux下的经常使用压缩解压缩命令 二,环境建立 三,内核编译 四,移植 一,linux下的经常使用压缩解压缩命令 在linux下常见的压缩文件格式有ta ...

  6. MapReduce程序依赖的jar包

    难得想写个mapreduce程序.发现已经不记得须要加入那些jar包了,网上找了一会也没发现准确的答案.幸好对hadoop体系结构略知一二.迅速试出了写mapreduce程序须要的五个jar包. 不多 ...

  7. asp.net中Repeart选中整行操作

    <asp:Repeater runat="server" ID="rpt_Student"> <HeaderTemplate> < ...

  8. 关于JavaScript 原型的理解

    原型的含义是指:如果构造器有个原型对象A,则由该构造器创建的实例(Object Instance)都必然复制于A.““在JavaScript中,对象实例(Object Instance)并没有原型,而 ...

  9. 追加addclass和removeclass

    //addclass             Base.prototype.addclass=function(classname){                 for(var i=0;i< ...

  10. excel笔记

    提取单元格中的数字部分 =MID(LOOKUP(1,-(1&MID(A1,MIN(FIND({0;1;2;3;4;5;6;7;8;9},A1&1/17)),ROW($1:$15)))) ...