7-05. 魔法优惠券(25) (数学 ZJU_PAT)

题目链接: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;
}
时间: 2024-12-27 19:54:37

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

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

题目链接:http://pat.zju.edu.cn/contests/ds/3-07 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之间以空格分隔. 输出格式说明: 输出前缀表达式的运算结果,精确到小

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~13的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式.每个数只能参与一次运算,4个数顺序可以任意组合,4个运算符任意取3个且可以重复取.运算遵从一定优先级别,可加括号控制,最终使运算结果为24.请输出一种解决方案的表达式,用括号表示运算优先.如果没有一种解决方案,则输出-1

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

题目链接:http://pat.zju.edu.cn/contests/ds/3-08 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: (1) int IsFull(Stack S):判断堆栈S是否已满,返回1或0: (2) int IsEmpty (Stack S ):判断堆栈S是否为空,返回1或0: (3) void Push(Stack S, ElementType item ):将元素item压入堆栈S: (4)

4-09. 笛卡尔树(25)(ZJU_PAT)

题目链接:http://www.patest.cn/contests/ds/4-09 笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2.首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大.其次所有结点的K2关键字满足优先队列(不妨设为最小堆)的顺序要求,即该结点的K2值比其子树中所有结点的K2值小.给定一棵二叉树,请判断该树是否笛卡尔树. 输入格式说明: 输入首先给出正整数N(<=1000),为树中结点的个数.随后N行,每行给出一个结点的信息,

6-06. 任务调度的合理性(25)(ZJU_PAT)

题目链接:http://pat.zju.edu.cn/contests/ds/6-06 假定一个工程项目由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其它一些子任务后才能执行."任务调度"包括一组子任务.以及每个子任务可以执行所依赖的子任务集. 比如完成一个专业的所有课程学习和毕业设计可以看成一个本科生要完成的一项工程,各门课程可以看成是子任务.有些课程可以同时开设,比如英语和C程序设计,它们没有必须先修哪门的约束:有些课程则不可以同时开设,因为它们有先后的依赖关系,比

【分享】近4000份数学学习资源免费分享给大家

一直以来喜欢收集数学类的教程资源,于是费了好大劲从万千合集站上扒拉了下来,总结归类了一下,一共有将近4000本电子书.经测试,均可免费下载,可能会弹出小广告,可不必理会之.[仅供学术学习和交流,请无用于商业用途.]另外,如有可能,还请尽量支持正版纸质书.   数学史(54)     数学史.rar 55.6 MB   数学的起源与发展.rar 4.3 MB   费马大定理—一个困惑了世间智者358年的谜.pdf 9.5 MB   通俗数学名著译丛14-无穷之旅:关于无穷大的文化史.pdf 14.

数学之美-阅读笔记

吴军的这本数学之美从google黑板报到实体书出版应该说一直都是比较火的,吴军博士作为早期加入google的那帮人,一直在搞搜索引擎的方向,除了本身是大牛还跟很多大牛一起共事过,眼界.见识.思维高度也不是一般人能比的.下面是一些凌乱的总结. 1.整个信息论的基础就是数学.如果往更远看,我们自然语言和文字的起源背后都受着数学规律的支配. 2.人们生活的经验作为一种特定的信息,其实是那个时代最宝贵的财富.(读者注:其实现在也是!) 3.信息冗余是信息安全的保障. 4.事实上,他们全靠的是数学,更准确

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

3.1 什么是魔法函数 类里面,实现某些特性的内置函数,类似 def __xx__(): 的形式. 不要自己定义XX,并不是和某个类挂钩的 class Company(object): def __init__(self, employee_list): self.employee = employee_list # 可迭代 def __getitem__(self, item): return self.employee[item] # 长度,实现了len函数 def __len__(self

(转)HubbleDotNet 和 Lucene.net 性能对比测试

HubbleDotNet 从 2009 年11月份发布第一个版本以来, 只对 0.7 版本做过一次性能对比测试,原因是近一年来,HubbleDotNet一直在做性能优化,截至2010年9月,性能已经优化的差不多了,索引和查询的性能比 0.7 版本时提高了很多倍.这两天重新对HubbleDotNet 与 Lucene.Net 做了性能对比测试.下面就公布一下我的测试数据. 测试版本 HubbleDotNet 0.9.7.0 Lucene.Net 2.9.2.1 盘古分词 2.3.1.0 测试环境