一、Ugly Numbers

  • 题目说一个数的质因数只包含2、3或者5(一个或多个),就是丑陋数。拜托,为啥这些数就丑陋了。然后题目特别说明第一个丑陋数是1
  • 题目多组数据输入到0为止,然后输出第n个丑陋数。
  • 解题思路就是对于一个丑陋数k,那么一定有2*k、3*k和5*k也是丑陋数,所以按照这个思路入队模拟打表即可
  • 值得注意的是,对于2*k1来说可能和 3*k2重复,例如2*12 = 3*8;所以在入队的时候不能让重复元素入队。
  • 代码:
 #include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iomanip>
#include <map>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <list>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <bitset>
#include <ctime>
#include <fstream>
#include <limits.h>
#include <numeric> using namespace std; #define F first
#define S second
#define mian main
#define ture true #define MAXN 1000000+5
#define MOD 1000000007
#define PI (acos(-1.0))
#define EPS 1e-6
#define MMT(s) memset(s, 0, sizeof s)
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef stringstream sstm;
const int INF = 0x3f3f3f3f; priority_queue<ll,vector<ll>,greater<ll> >q;
vector<ll>p(); void init(){
q.push();
int num = ;
for(int i = ; i <= ; i++){
ll sum = q.top();
q.pop();
p[num++] = sum;
ll a = sum*, b = sum*, c = sum*;
if((a % ) && (a % ))
q.push(a);
if(b % )
q.push(b);
q.push(c);
}
} int main(){
ios_base::sync_with_stdio(false);
cout.tie();
cin.tie();
int n;
init();
while(cin>>n && n){
cout << p[n] << endl;
} return ;
}

二、The kth great number

  • 题意就是第一行输入n,k,表示下面有n行操作,I a表示把a入队,Q表示查询并输出当前数字中第k大的数。
  • 用优先队列存k个元素,当已经存了k个元素,新元素进入再出队就行了。
  • 代码:
 #include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iomanip>
#include <map>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <list>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <bitset>
#include <ctime>
#include <fstream>
#include <limits.h>
#include <numeric> using namespace std; #define F first
#define S second
#define mian main
#define ture true #define MAXN 1000000+5
#define MOD 1000000007
#define PI (acos(-1.0))
#define EPS 1e-6
#define MMT(s) memset(s, 0, sizeof s)
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef stringstream sstm;
const int INF = 0x3f3f3f3f; struct node{
int num;
friend bool operator < (node a,node b){
return a.num > b.num;
}
}temp; int main(){
ios_base::sync_with_stdio(false);
cout.tie();
cin.tie();
int n,k;
while(~scanf("%d%d",&n,&k)){
priority_queue<node>q;
for(int i = ; i < n; i++){
char tp;
int num;
scanf(" %c",&tp);
if(tp == 'I'){
scanf("%d",&num);
if(q.size() >= k){
if(num > q.top().num){
q.pop();
temp.num = num;
q.push(temp);
}
}
else{
temp.num = num;
q.push(temp);
}
}
else{
int res = q.top().num;
cout << res << endl;
}
}
} return ;
}

三、Fence Repair

  • 题面坑死我了,好半天才搞懂题意,就是第一行n,然后下面n个数,表示要把原木头锯成这么n段。然后每一次锯木头就消耗木头长度的钱,问最少要多少钱。
  • 思路是递归的思路,从最短的开始往回推,因为设锯开后的长度分别为a,b,肯定要保证a+b最小,才能消耗最少。
  • 所以就是从最小和次小的开始,加起来入队,同时消耗的金钱也要加上这个和。
  • 代码:
 #include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iomanip>
#include <map>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <list>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <bitset>
#include <ctime>
#include <fstream>
#include <limits.h>
#include <numeric> using namespace std; #define F first
#define S second
#define mian main
#define ture true #define MAXN 1000000+5
#define MOD 1000000007
#define PI (acos(-1.0))
#define EPS 1e-6
#define MMT(s) memset(s, 0, sizeof s)
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef stringstream sstm;
const int INF = 0x3f3f3f3f; int main(){
ios_base::sync_with_stdio(false);
cout.tie();
cin.tie();
int n;
while(cin>>n){
priority_queue<int, vector<int>,greater<int> >q;
ll ans = ,num,a,b;
for(int i = ; i < n; i++){
cin>>num;
q.push(num);
}
while(q.size() > ){
a = q.top();
q.pop();
b = q.top();
q.pop();
q.push(a+b);
ans += a+b;
}
cout << ans << endl;
} return ;
}

四、看病要排队

  • 另一篇文章有讲这个题,思路就是开三个优先队列模拟即可
  • 代码:
 #include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iomanip>
#include <map>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <list>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <bitset>
#include <ctime>
#include <fstream>
#include <limits.h>
#include <numeric> using namespace std; #define F first
#define S second
#define mian main
#define ture true #define MAXN 1000000+5
#define MOD 1000000007
#define PI (acos(-1.0))
#define EPS 1e-6
#define MMT(s) memset(s, 0, sizeof s)
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef stringstream sstm;
const int INF = 0x3f3f3f3f; struct node{
int id;
int cnt;
node(int id,int cnt):id(id),cnt(cnt){}
friend operator < (node a,node b){
if(a.cnt == b.cnt){
return a.id > b.id;
}
return a.cnt < b.cnt;
}
}; int main(){
ios_base::sync_with_stdio(false);
cout.tie();
cin.tie();
int n;
while(cin>>n){
priority_queue<node>j,k,l;
int tot = ;
for(int i = ; i <= n; i++){
string s;
int a,b;
cin>>s;
if(s[] == 'I'){
cin>>a>>b;
node tp(tot++,b);
if(a == ){
j.push(tp);
}
else if(a == ){
k.push(tp);
}
else if(a == ){
l.push(tp);
}
}
else if(s[] == 'O'){
cin>>a;
if(a == ){
if(j.empty()){
cout<<"EMPTY"<<endl;
}
else{
node tp = j.top();
j.pop();
cout<<tp.id<<endl;
}
}
else if(a == ){
if(k.empty()){
cout<<"EMPTY"<<endl;
}
else{
node tp = k.top();
k.pop();
cout<<tp.id<<endl;
}
}
else if(a == ){
if(l.empty()){
cout<<"EMPTY"<<endl;
}
else{
node tp = l.top();
l.pop();
cout<<tp.id<<endl;
}
} }
}
}
return ;
}

五、Windows Message Queue

  • 就是叫你模拟信息队列
  • 两种操作GET就是得到优先级最高的信息出队,PUT三个参数,序号,信息,优先级值。
  • 题目说明优先级值越低的优先级越高,然后优先级值相同时,谁先进谁优先级高。
  • 队列为空时输出EMPTY QUEUE!
  • 开个结构体存信息,优先级值,序号,重载一下<号,模拟即可
  • 代码:
 #include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iomanip>
#include <map>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <list>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <bitset>
#include <ctime>
#include <fstream>
#include <limits.h>
#include <numeric> using namespace std; #define F first
#define S second
#define mian main
#define ture true #define MAXN 1000000+5
#define MOD 1000000007
#define PI (acos(-1.0))
#define EPS 1e-6
#define MMT(s) memset(s, 0, sizeof s)
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef stringstream sstm;
const int INF = 0x3f3f3f3f; struct node{
string msg;
int num,id;
node(string _msg,int _num,int _id):msg(_msg),num(_num),id(_id){}
friend operator < (node a,node b){
if(a.num == b.num){
return a.id > b.id;
}
return a.num > b.num;
}
}; int main(){
ios_base::sync_with_stdio(false);
cout.tie();
cin.tie();
priority_queue<node,vector<node>,less<node> >p;
int i = ;
while(++i){
string s;
if(!(cin>>s)){
break;
}
if(s[] == 'G'){
if(p.empty()){
cout << "EMPTY QUEUE!" << endl;
}
else{
node tp = p.top();
p.pop();
cout << tp.msg << endl;
}
}
else{
string msg,ct;
int num;
cin>>msg>>ct>>num;
//cout << msg << " " << ct << " " << num << endl;
msg = msg + ' ' + ct;
//cout << msg << endl;
p.push(node(msg,num,i)); }
} return ;
}

六、Black Box

  • 也是欺负我英语不好,翻译老半天
  • 第一行给你一个n和k
  • 第二行n个数,第三行k个数
  • 然后输出当第ki个数输入是,第i小的数是多少。
  • 思路是开一个小顶堆和大顶堆,当查询第i个元素时,把前ki个元素先入小顶堆,然后把交换两个堆的元素,直到保证小顶堆所有元素都大于大顶堆里面的,这样小顶堆的首元素就是第i小的数。然后依次把小顶堆的数往大顶堆移即可。
  • 代码:
 #include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iomanip>
#include <map>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <list>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <bitset>
#include <ctime>
#include <fstream>
#include <limits.h>
#include <numeric> using namespace std; #define F first
#define S second
#define mian main
#define ture true #define MAXN 1000000+5
#define MOD 1000000007
#define PI (acos(-1.0))
#define EPS 1e-6
#define MMT(s) memset(s, 0, sizeof s)
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef stringstream sstm;
const int INF = 0x3f3f3f3f; int a[]; int main(){
ios_base::sync_with_stdio(false);
cout.tie();
cin.tie();
int n,m,x;
priority_queue<int, vector<int>,greater<int> >p;
priority_queue<int, vector<int>,less<int> >q;
cin>>n>>m;
for(int i = ; i < n; i++){
cin>>a[i];
}
int c = ;
for(int i = ; i < m; i++){
cin>>x;
while(c < x){
p.push(a[c++]);
}
while(!q.empty() && p.top() < q.top()){
int t = p.top();
p.pop();
p.push(q.top());
q.pop();
q.push(t);
}
cout << p.top() << endl;
q.push(p.top());
p.pop();
}
return ;
}

七、Stones

  • 另一篇博文也有些,就是开个结构体存位置和能抛多远就行,再重构一下排序操作。
  • 代码:
 #include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iomanip>
#include <map>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <list>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <bitset>
#include <ctime>
#include <fstream>
#include <limits.h>
#include <numeric> using namespace std; #define F first
#define S second
#define mian main
#define ture true #define MAXN 1000000+5
#define MOD 1000000007
#define PI (acos(-1.0))
#define EPS 1e-6
#define MMT(s) memset(s, 0, sizeof s)
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef stringstream sstm;
const int INF = 0x3f3f3f3f; struct node{
int pos,num;
bool operator < (const node b)const{
if(pos != b.pos)
return b.pos < pos;
return b.num < num;
}
}; int main(){
ios_base::sync_with_stdio(false);
cout.tie();
cin.tie();
int t,n;
node tp;
cin>>t;
while(t--){
cin>>n;
priority_queue<node>q;
for(int i = ; i < n; i++){
cin>>tp.pos>>tp.num;
q.push(tp);
}
int flag = ;
while(!q.empty()){
tp = q.top();
q.pop();
if(flag){
flag = ;
tp.pos += tp.num;
q.push(tp);
}
else
flag = ;
}
cout << tp.pos << endl;;
}
return ;
}

八、求中位数

  • 这道题开始我想偷懒vector处理直接tle =7=
  • 和黑盒子那题一样,开两个优先队列维护即可。
  • 不过这题有个坑点就是题目说明数据在int范围内,但你开int的堆就会wa,得开longlong(别问我为啥会知道=7=)
  • 代码:
 #include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iomanip>
#include <map>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <list>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <bitset>
#include <ctime>
#include <fstream>
#include <limits.h>
#include <numeric> using namespace std; #define F first
#define S second
#define mian main
#define ture true #define MAXN 1000000+5
#define MOD 1000000007
#define PI (acos(-1.0))
#define EPS 1e-6
#define MMT(s) memset(s, 0, sizeof s)
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef stringstream sstm;
const int INF = 0x3f3f3f3f; int main(){
ios_base::sync_with_stdio(false);
cout.tie();
cin.tie();
int n;
while(cin>>n){
priority_queue<ll>q;
priority_queue<ll,vector<ll>,greater<ll> >p;
for(int i = ; i < n; i++){
ll a,b;
cin>>a;
if(a == ){
cin>>b;
if(q.empty() && p.empty()){
q.push(b);
}
else{
if(b > q.top()){
p.push(b);
}
else{
q.push(b);
}
if(q.size() < p.size()){
q.push(p.top());
p.pop();
}
else if(q.size() > p.size() + ){
p.push(q.top());
q.pop();
}
}
}
else{
if((q.size() + p.size()) % == ){
ll res = q.top() + p.top();
if(res % == )
cout << res/ << endl;
else
cout << fixed << setprecision() << (db)res/2.0 << endl;
}
else{
ll res = q.top();
cout << res << endl;
}
}
}
} return ;
}

FJUT - OJ优先队列专题题解的更多相关文章

  1. 搜索专题题解(FJUT - OJ 17级搜索强化训练)

    题目连接:http://120.78.128.11/Contest.jsp?cid=221#H 题目都比较难,每道题都很经典,我也做的很慢,这篇博文算是个收录.具体题目题解点击下面超链接吧. 一.Br ...

  2. 几道STL题目(FJUT - OJ STL训练1)

    这个OJ一直在做,一些专题题目都很好,从易至难,阶梯上升,很适合像我这样的蒟蒻 =7= 这篇是关于其中一个专题训练的题解思路及代码   http://120.78.128.11/Contest.jsp ...

  3. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  4. $vjudge-$基本算法专题题解

    考完期末又双叒回来刷普及题辣$kk$ 然后放个链接趴还是$QwQ$ [X]$A$ 因为是嘤文($bushi$所以放个题意趴$QwQ$ 就汉诺塔问题,只是说有四个塔$A,B,C,D$,要求输出有1-12 ...

  5. $vjudge-dp$专题题解

    因为感觉题解写不了多少,,,就懒得一道道题目慢慢写了,汇总了算了$QAQ$ 昂然后因为我估计以后还会有些什么$dp$专题啊$balabala$的,,,然后谢总肯定又会建一堆小组啥的,,,所以还是放个链 ...

  6. bzoj4458 GTY的OJ (优先队列+倍增)

    把超级钢琴放到了树上. 这次不用主席树了..本来以为会好写一点没想到细节更多(其实是树上细节多) 为了方便,对每个点把他的那个L,R区间转化成两个深度a,b,表示从[a,b)选一个最小的前缀和(到根的 ...

  7. 2016 UESTC DP专题题解

    题解下载地址:http://pan.baidu.com/s/1eSx27Jk 题解下载地址:http://pan.baidu.com/s/1qYDxlhi

  8. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  9. Kuangbin 带你飞-基础计算几何专题 题解

    专题基本全都是模版应用.贴一下模版 平面最近点对 const double INF = 1e16; ; struct Point { int x,y; int type; }; double dist ...

随机推荐

  1. 100天搞定机器学习|day39 Tensorflow Keras手写数字识别

    提示:建议先看day36-38的内容 TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edge ...

  2. 论文解读2——Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    背景 用ConvNet方法解决图像分类.检测问题成为热潮,但这些方法都需要先把图片resize到固定的w*h,再丢进网络里,图片经过resize可能会丢失一些信息.论文作者发明了SPP pooling ...

  3. Yii GridView Ajax 刷新

    Yii GridView  Ajax 刷新,当页面点击一个按钮时,刷新数据. 1.控制器 <?php class privController extends Controller{ publi ...

  4. 开源音乐下载神器XMusicDownloader更新,支持歌单一键下载,支持无损音乐

    开源音乐下载神器XMusicDownloader更新啦,新增网易.腾讯音乐歌单歌曲.歌手歌曲.专辑歌曲一键下载,同时支持下载flac无损音乐. 功能 V1.0 功能开源工具软件XMusicDownlo ...

  5. iView表格行验证问题

    iView Table 3.2.0 版本 需求: 验证前两行的姓名不能为空: 解决方案: 判断是否前两行,如是则增加校验规则: 需在<FormItem>前加<Form>标签否则 ...

  6. iOS 11 变化

    首先我是开发者,更关心对技术的影响,我又需要关注.学习哪些技术,猫神的文章:http://www.cocoachina.com/ios/20170607/19457.html 介绍了 ******** ...

  7. Spring-Boot:多种配置注入方式

    package com.example.el; import org.springframework.beans.factory.annotation.Value; import org.spring ...

  8. HBase 系列(十一)—— Spring/Spring Boot + Mybatis + Phoenix 整合

    一.前言 使用 Spring+Mybatis 操作 Phoenix 和操作其他的关系型数据库(如 Mysql,Oracle)在配置上是基本相同的,下面会分别给出 Spring/Spring Boot ...

  9. 消息中间件——RabbitMQ(八)高级特性全在这里!(下)

    前言 上一篇消息中间件--RabbitMQ(七)高级特性全在这里!(上)中我们介绍了消息如何保障100%的投递成功?,幂等性概念详解,在海量订单产生的业务高峰期,如何避免消息的重复消费的问题?,Con ...

  10. 剑指Offer(二十一):栈的压入、弹出序列

    剑指Offer(二十一):栈的压入.弹出序列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...