CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)
Description
促销活动遵守以下规则:
- 一个消费者 —— 想参加促销活动的消费者,在账单下记下他自己所付的费用,他个人的详细情况,然后将账单放入一个特殊的投票箱。
- 当每天促销活动结束时,从投票箱中抽出两张账单:
第一张被抽出的账单是金额最大的账单
然后被抽出的是金额最小的账单,对于付了金额最大账单的这位消费者,将得到一定数目的奖金,其奖金数等于他账单上的金额与选出的最小金额的差。
为了避免一个消费者多次获奖,根据上面所抽出的两张账单都不返回到投票箱,但是剩下的账单还继续参加下一天的促销活动。
超市的售出额是巨大的,这样可以假定,在每天结束,拿出数额最大账单和数额最小账之前,在投票箱内就已经至少存在了 2 张账单。你的任务是去计算每天促销活动投进投票箱的账单数额的基本信息。在整个活动中开销总数。
本题中约定:
整个活动持续了 N 天 (N<=5000) 。 第 i 天放入的帐单有 a[i] 张, a[i]<=10^5 。且 sigma(a[1]...a[n])<=10^6 。 每一天放入的帐单的面值均 <=10^6 。
Input
第一行是一个整数 n ( 1 <= n <= 5000 ),表示促销活动历时的天数。
以下的 n 行,每行包含若干由空格分隔的非负整数。第 i+1 行的数表示在第 i 天投入箱子的账单金额。每行的第一个数是一个整数 k ( 0 <= k <= 10^5 ), 表示当日账单的数目。后面的 k 个正整数代表这 k 笔账单的金额,均小于10^6 。
整个活动中涉及到的账单笔数不会超过 10^6 。
Output
输出唯一一行是一个整数,等于整个促销活动中应该付出的奖金总额。
Sample Input
5
3 1 2 3
2 1 1
4 10 5 5 1
0
1 2
Sample Output
19
Http
CJOJ:http://oj.changjun.com.cn/problem/detail/pid/2482
Source
STL,优先队列
题目大意
一个商场搞促销活动n天,每天选出最高账单和最低账单,求所有最高账单-最低账单的总和。
解决思路
这道题是优先队列的运用。分别维护两个优先队列,一个最小值优先,一个最大值优先,每次弹出队首元素即可。需要注意的是,一个元素是在两个队列中同时存在的,而有可能在这个队列中弹出去了,而在另一个队列中还没有,所以要用一个Cnt数组统计一下每个元素出现的次数,若某次发现队首元素的Cnt已经为0了,则说明已经在另外一个队列中弹出,将重复的去除即可。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxN=5001;
const int inf=2147483647;
int n;
priority_queue<int,vector<int>,less<int> > Q1;//大的优先
priority_queue<int,vector<int>,greater<int> > Q2;//小的优先
int Cnt[1000001]={0};//统计每一种金额的次数
int main()
{
int K;
int value;
int Ans=0;
cin>>n;
for (int i=1;i<=n;i++)
{
scanf("%d",&K);
for (int j=1;j<=K;j++)
{
scanf("%d",&value);
Cnt[value]++;
Q1.push(value);
Q2.push(value);
}
while (Cnt[Q1.top()]==0)//如果这种金额次数已经没有了,说明在另一个优先队列中已经弹出直接去掉即可
Q1.pop();
while (Cnt[Q2.top()]==0)//与上面同理
Q2.pop();
Ans=Ans+Q1.top()-Q2.top();
//cout<<Q1.top()<<" "<<Q2.top()<<endl;
Cnt[Q1.top()]--;
Cnt[Q2.top()]--;
Q1.pop();
Q2.pop();
}
cout<<Ans<<endl;
return 0;
}
CJOJ 2482 【POI2000】促销活动的更多相关文章
-
CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)
CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...
-
【CJOJ2482】【POI2000】促销活动
题面 Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用,他个人的详细情况,然后将账单放入一个特殊的投票箱. 当每天促销活动结束时, ...
-
【bzoj2947】[Poi2000]促销
2947: [Poi2000]促销 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 181 Solved: 120[Submit][Status][D ...
-
BZOJ_2947_[Poi2000]促销_堆
BZOJ_2947_[Poi2000]促销_堆 Description Bytelandish连锁超市委托你编写一个程序来模拟一项即将施行的促销活动,该活动的规则如下: ●想要参与的顾客,只需把他的个 ...
-
从电商平台促销活动看电商app开发趋势
据亿合科技小编了解到:尽管各大电商平台都进入了品质和品牌时代,但对于消费者来说,低价依然是一个有吸引力的因素.尼尔森<网络购物者趋势研究>报告显示,2016年价格敏感型购物者的比例从15% ...
-
bzoj2947: [Poi2000]促销
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 178 Solved: 119[Submit][Status][Discuss] Descriptio ...
-
面试作业之浅析京东促销活动核心模型 - DDD
前言 京东作为中国最大的自营式B2C电商平台,提供一站式综合性购物,服务亿万家庭,涵盖3C.家电.消费品.服饰.家居家装.生鲜和新通路(B2B),满足了消费者的多元化需求.每天都会发布相关的促销活动, ...
-
亚马逊促销活动Promotion②:Money Off(满减折扣)的设置教程
满减.折扣是放之四海皆有效的促销手段,虽然亚马逊对卖家有诸多限制,但这个促销方式却是允许的,对亚马逊的卖家而言,这对提升商品销量.打造爆款都是极好的.今天小编来讲讲亚马逊的Money Off要怎么设置 ...
-
vivo全球商城时光机 - 大型促销活动保障利器
一.背景 官网商城在双11.双12等大促期间运营同学会精心设计许多给到用户福利的促销活动,当促销活动花样越来越多后就会涉及到很多的运营配置工作(如指定活动有效期,指定活动启停状态,指定活动参与商品等等 ...
随机推荐
-
hdu 1004 Let the Balloon Rise
Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- BUG等级和严重等级关系
-
解析txt文本,dom4j工具输出为xml文档
有如下一个ttl.txt文本文档,每一行用空格隔开的三段分别代表主谓宾, 要将它们输出为xml格式文档 工具:dom4j,jar包导入MyEclipse的Java Project工程 代码如下: pa ...
-
温故而知新 clone
浅复制(浅克隆) 被复制对象所有变量都含有与原来对象的相同值,对象中对其他对象的引用仍然指向原来的对象,换言之,复制对象只复制考虑的对象,而不复制所引用的对象.继承自java.lang.Object类 ...
-
C#并行和多线程编程_(1)认识Parallel
Parallel: 英 [ˈpærəlel] 美 [ˈpærəˌlɛl] ,并联的,并行的. 随着多核时代的到来,并行开发越来越展示出它的强大威力!使用并行程序,充分的利用系统资源,提高程序的性 ...
-
LeetCode (13): 3Sum Closest
https://leetcode.com/problems/3sum-closest/ [描述] Given an array S of n integers, find three integers ...
-
NewsServiceImpl
package com.pb.news.service.impl; import java.util.List; import com.pb.news.dao.NewsDao;import com.p ...
-
排序之冒泡排序(bubblesort)
package com.pailian; /* * 冒泡排序 * 比较相邻的俩位数,这样每轮比较都会出现一个最大值或最小值 * 下一轮比较就会减少一次(因为已经知道了一个最大值或最小值) * 注意根据 ...
-
读书笔记 C#事件event浅析(一)
在C#中,所谓event事件,就是一种特殊的委托.如果要声明事件,首先就要声明一个相对应的委托类型.按照流程来说,事件相当于委托类型往上升了一级似的,我是这样认为的. //1.先声明委托类型 publ ...
-
java 锁的分类
java中为了解决多线程并发带来的线程安全问题,引入了锁机制. 一.公平锁和非公平锁 1.公平锁:按照申请锁的顺序(FIFO队列)来获取锁. 2.非公平锁:所有线程都会竞争,获取的锁的顺序和申请顺序无 ...