avatar
问一道multiset的题# JobHunting - 待字闺中
l*y
1
第一次用multiset,不知道怎么用
题目应该很简单的,蛮力排序的话会超时。
网上的评论是
Easy. Don't use cin or cout and you could use a multiset :)
实在无语。没想出怎么用multiset。
谁给解释一下。谢谢了!
Problem H: Hoax or what
Each Mal-Wart supermarket has prepared a promotion scheme run by the
following
rules:
* A client who wants to participate in the promotion (aka a sucker) must
write down their phone number on the bill of their purchase and put the
bill into a special urn.
* Two bills are selected from the urn at the end of each day: first the
highest bill is selected and then the lowest bill is selected. The client
who paid the largest bill receives a monetary prize equal to the difference
between his bill and the lowest bill of the day.
* Both selected bills are not returned to the urn while all the
remaining ones are kept in the urn for the next day.
* Mal-Wart has many clients such that at the end of each day there are
at least two bills in the urn.
Your task is to write a program which takes information about the bills put
into the urn and computes Mal-Wart's cost of the promotion.
The input contains a number of cases. The first line in each case contains
an integer n, 1<=n<=5000, the number of days of the promotion. Each of the
subsequent n lines contains a sequence of non-negative integers separated by
whitespace. The numbers in the (i+1)-st line of a case give the data for
the i-th day. The first number in each of these lines, k, 0≤k≤105, is the
number of bill
s and the subsequent k numbers are positive integers of the bill amounts. No
bill is bigger than 106. The total number of all bills is no bigger than
106. The case when n = 0 terminates the input and should not be processed.
For each case of input print one number: the total amount paid to the
clients by Mal-Wart as the result of the promotion.
Sample input
5
3 1 2 3
2 1 1
4 10 5 5 1
0
1 2
2
2 1 2
2 1 2
0
Output for sample input
19
2
avatar
c*p
2
用一个最大堆和最小堆就可以了吧。。
或者直接BST也可以。

【在 l*********y 的大作中提到】
: 第一次用multiset,不知道怎么用
: 题目应该很简单的,蛮力排序的话会超时。
: 网上的评论是
: Easy. Don't use cin or cout and you could use a multiset :)
: 实在无语。没想出怎么用multiset。
: 谁给解释一下。谢谢了!
: Problem H: Hoax or what
: Each Mal-Wart supermarket has prepared a promotion scheme run by the
: following
: rules:

avatar
l*y
3
是可以,但是如果你在最大堆拿掉一个最大值,同时也要拿掉最小堆的这个值。
这样就要implement heap.find,而不能用STL 的 priority_queue了,因为priority_
queue里没有find。
这样编程很累的。我看很多人谈论这道题都是说multiset,所以来问一下。
多谢了

【在 c****p 的大作中提到】
: 用一个最大堆和最小堆就可以了吧。。
: 或者直接BST也可以。

avatar
c*p
4
multiset的数据是ordered。
所以 begin()返回最小值的iterator,end()-1返回最大值的iterator,
然后erase()就可以了。
本质上还是某种二叉搜索树。

【在 l*********y 的大作中提到】
: 是可以,但是如果你在最大堆拿掉一个最大值,同时也要拿掉最小堆的这个值。
: 这样就要implement heap.find,而不能用STL 的 priority_queue了,因为priority_
: queue里没有find。
: 这样编程很累的。我看很多人谈论这道题都是说multiset,所以来问一下。
: 多谢了

avatar
h*6
5
multiset和set的用法完全一样,只是允许有多个数重复而已。每天向multiset里insert一行数值,并把最大和最小的去掉即可。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。