【题目链接】

ybt 1372:小明的账单

【题目考点】

1. 多重集合 multiset

2. 堆 priority_queue

【解题思路】

解法1:使用多重集合multiset

多重集合multiset原理是红黑树,相同的数据在multiset中可以保存多份。数据在multiset中是有序的,默认按升序排序,multiset中第一个元素是最小值,最后一个元素是最大值。
输入n,循环n次,把每天的账单数值加入到multiset中,每天选出multiset中的最大值和最小值,输出并删掉这两个值。
总添加的账单数达到 1 0 6 10^6 106(每天100个,一共15000天),删除的账单数达到 1 0 4 10^4 104个(每天删2个,一共15000天),红黑树中添加、删除元素的复杂度都为 O ( l o g n ) O(logn) O(logn),复杂度可以接受。
【注意】输出数据量较大,可以使用scanf/printf,或解除io同步,io解绑,使用’\n’。

解法2:使用堆

设账单类型,属性包括账单面额和账单编号。设大顶堆与小顶堆,里面保存的数据类型为账单类型。大顶堆中账单面额更大的更优先,小顶堆中账单面额更小的更优先。
输入数据,对于输入的每个账单,生成一个账单对象,给每个账单都分配唯一的编号,并把每个账单分别加入大顶堆和小顶堆。
设vis数组,vis[i]表示编号为i的账单是否已经被支付。(最多有15000天,每天最多100个账单,因此vis数组的长度设为1500000)
每天选择支付账单的方法如下:

  • 大顶堆中堆顶账单只要已经被支付,则删除堆顶,直到堆顶未被支付。那么此时堆顶账单为剩下的面额最大的账单,输出堆顶账单面额,将该账单设为已支付,删除堆顶。
  • 小顶堆中堆顶账单只要已经被支付,则删除堆顶,直到堆顶未被支付。那么此时堆顶账单为剩下的面额最小的账单,输出堆顶账单面额,将该账单设为已支付,删除堆顶。

【题解代码】

解法1:使用多重集合multiset

#include<bits/stdc++.h>
using namespace std;
int main()
{multiset<int> ms;//默认使用less<int>仿函数 int n, t, m; scanf("%d", &n);for(int i = 1; i <= n; ++i){scanf("%d", &t);//这一行的数量 for(int j = 1; j <= t; ++j){scanf("%d", &m);//输入账单钱数 ms.insert(m);}multiset<int>::iterator itFirst = ms.begin(), itLast = prev(ms.end());printf("%d %d\n", *itFirst, *itLast);ms.erase(itFirst);ms.erase(itLast); }return 0;
}

解法2:使用堆

#include<bits/stdc++.h>
using namespace std;
#define N 1500005
struct Node
{int money, i;//m:账单面额 i:账单编号 Node(){}Node(int a, int b):money(a), i(b){}
};
struct SmallCmp//小顶堆比较仿函数
{bool operator () (Node a, Node b){return b.money < a.money;}
};
struct BigCmp//大顶堆比较仿函数
{bool operator () (Node a, Node b){return b.money > a.money;}
};
bool vis[N];//vis[i]:编号为i的账单是否已经支付
int main()
{ios::sync_with_stdio(false);cin.tie(0);priority_queue<Node, vector<Node>, SmallCmp> small_pq;//小顶堆priority_queue<Node, vector<Node>, BigCmp> big_pq;//大顶堆int n, t, m, ind = 0;//ind:编号 cin >> n;for(int i = 1; i <= n; ++i){cin >> t;//这一行的数量 for(int j = 1; j <= t; ++j){cin >> m;//输入账单钱数 ind++;//编号加1 small_pq.push(Node(m, ind));//小顶堆添加编号为ind的面值为m的账单 big_pq.push(Node(m, ind));//大顶堆添加编号为ind的面值为m的账单}while(vis[small_pq.top().i])//小顶堆中不断找面值最小的账单,如果已支付则删除 small_pq.pop();cout << small_pq.top().money << ' ';vis[small_pq.top().i] = true;small_pq.pop();while(vis[big_pq.top().i])//大顶堆中不断找面值最大的账单,如果已支付则删除 big_pq.pop();cout << big_pq.top().money << '\n';vis[big_pq.top().i] = true;big_pq.pop();}return 0;
}

信息学奥赛一本通 1372:小明的账单相关推荐

  1. 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...

  2. 信息学奥赛一本通 (C++)上机练习

    信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...

  3. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

  4. 信息学奥赛一本通 2021:【例4.6】最大公约数

    [题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...

  5. 信息学奥赛一本通在线提交地址

    信息学奥赛一本通 1 C++语言入门 1.1 综合 1.1.1 P1458 地球人口承载力估计 正确: 770 提交: 1794 比率: 42.92 % 1.1.2 P1686 Hello, Worl ...

  6. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

  7. 信息学奥赛一本通——2068:【例2.6】鸡兔同笼

    大家好(๑╹◡╹)ノ" 这里是小蒟蒻 一天没更新了呢! 今天给大家带来<信息学奥赛一本通--2068:[例2.6]鸡兔同笼> 题目: 2068:[例2.6]鸡兔同笼 时间限制: ...

  8. 信息学奥赛一本通 第五版(C++版)

    信息学奥赛一本通 第五版(C++版)第一部分 C++语言 第一章 C++语言入门 第二节 C++语言程序设计 P15 1. 编写一个能够输出Hello,World!的程序,这个程序常常作为一个初学者接 ...

  9. 信息学奥赛一本通 1244:和为给定数 通过

    我的信息学奥赛一本通个人主页:信息学奥赛一本通(C++版)在线评测系统http://ybt.ssoier.cn:8088/userinfo.php?name=15276768892 1244:和为给定 ...

最新文章

  1. android studio 的中文网站
  2. 神童、数学家、抑郁症患者,控制论之父诺伯特·维纳的一生
  3. 女性程序员占比超17%,平均月薪近2万 | 程序员就业大数据报告
  4. 隐藏在Win XP中的28个秘密武器
  5. arcgis9.2系列下载
  6. 3500字的txt文件_split文件拆分与合并,看完还不会,拿头拍我
  7. QPS/TPS/并发量/系统吞吐量
  8. PHP的Postman使用
  9. android 推送的小图标,android - 推送通知中没有声音并且没有自定义的小图标 - 堆栈内存溢出...
  10. mkfs.jffs2 制作镜像问题整理【原创】
  11. 爬虫基础(五)-----scrapy框架简介
  12. 让博客园博客自动生成章节目录索引
  13. 七款非常好用的电脑数据恢复软件推荐
  14. GIS数据在哪里下载
  15. [安洵杯 2019]easy misc 1
  16. Spring securty<三> 认证案例代码
  17. Handing time
  18. FPGA学习日志——半加器half_adder
  19. 台式计算机突然连接不到网络,电脑突然网络感叹号导致不能上网的解决方法
  20. 经典进程同步问题(十)

热门文章

  1. 群晖和QNAP的NAS的备份功能的测试
  2. Android Studio入门教程(计算器)
  3. 初读《偷影子的人》观后感
  4. 云开发小程序项目实战 二
  5. Place Route相关
  6. CANoe从入门到精通“保姆级”教程(五)- Panel面板设计之一
  7. java切换卡片_CardView之可切换式卡片
  8. 计算机配置的内存的容量为4g,安装内存4g2g可用的原因和处理
  9. c语言输出一个n行m列的图形
  10. 在Windows Media Player 12中创建自定义播放列表