面向对象程序设计(荣誉)实验五 priority_queue,map

简介: 面向对象程序设计(荣誉)实验五 priority_queue,map

1. 消息队列(priority_queue)


题目描述


消息队列是Windows系统的基础。对于每个进程,系统维护一个消息队列。如果在这个过程中发生了一些事情,如鼠标单击、文本更改,系统将向队列添加一条消息。同时,如果队列中的消息不为空,进程将根据优先级值进行一个从队列中获取消息的循环。注意,优先级数字越低表示优先级越高。在这个问题中,您需要模拟消息队列,以便将消息放入消息队列并从消息队列中获取消息。


输入


输入中只有一个测试用例。每行都是一个命令,“get”或“put”,这意味着获取消息或放置消息。如果命令为“Put”,则有一个字符串表示消息名,两个整数表示参数和优先级。最多有60000个命令。请注意,一条消息可能出现两次或两次以上,如果两条消息具有相同的优先级,则先出现的消息将首先被处理。(即,相同优先级的FIFO。)处理到输入结束。


输出


对于每个“get”命令,在一行中输出从消息队列获取的命令以及名称和参数。如果队列中没有消息,则输出“Empty”。“Put”命令没有输出。


样例输入


GET

PUT msg1 10 5

PUT msg2 10 4

GET

GET

GET


样例输出


EMPTY

msg2 10

msg1 10

EMPTY


题解

#include<bits/stdc++.h>
using namespace std;
struct node{
  int num,level;
  string name;
  node(string name,int num,int level):name(name),num(num),level(level){}
  bool operator <(const node& rhs)const{
    return level > rhs.level;
  }
int main() {
  priority_queue<node> q;
  string op;
  string name;
  int num,level;
  while(cin>>op){
    if(op == "PUT"){
      cin >> name>>num>>level;
      q.push(node(name,num,level));
    }
    if(op == "GET"){
      if(!q.empty()){
        node now = q.top();
        q.pop();
        cout<<now.name<<" "<<now.num<<endl;
      }else{
        cout<<"EMPTY\n"; 
      }
    }
  }
}

2. 矩形排序(优先队列)


题目描述


使用优先队列实现把输入的多个矩形按面积降序输出,假定矩形面积互不相等


要求


1、矩形封装成类对象


2、优先队列的数据类型是矩形类


3、使用优先队列按面积降序输出矩形信息


提示:如果优先队列的数据类型不是标准类型,需要重载<运算符。


输入


第一行输入n表示矩形个数


接着输入n行,每行输入矩形的名称、长、宽


输出


按要求输出,每个矩形输出一行,参考输出样例


样例输入


5

aaa 2 3

bbb 3 4

ccc 4 5

ddd 5 3

eee 4 4


样例输出


ccc–20

eee–16

ddd–15

bbb–12

aaa–6


题解

#include<bits/stdc++.h>
using namespace std;
class rectangle
{
    private:
        string name;
        int a, b;
    public:
        rectangle() { ; }
        rectangle(string n, int x, int y) { name = n;
            a = x;
            b = y;
        }
        void display()const {
            cout << name << "--" << a * b << endl;
        }
        bool operator <(const rectangle &r)const
        {
            return this->a * this->b < r.a * r.b;
        }
};
int main()
{
    int t;
    cin >> t;
    priority_queue<rectangle> group;
    while(t--)
    {
        string name;
        int a, b;
        cin >> name >> a >> b;
        rectangle r(name, a, b);
        group.push(r);
    }
    while(!group.empty())
    {
        group.top().display();
        group.pop();
    }
    return 0;
}

3. 赫夫曼树的构建(priority_queue)


题目描述


Huffman树在编码中有着广泛的应用。 在这里,我们只关心Huffman树的构造过程。 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:


找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。


重复步骤1,直到{pi}中只剩下一个数。 在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。 本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。 例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:


找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。


找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。


找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。


找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。


现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。


输入


输入的第一行包含一个正整数n(n<=100)。 接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。


输出


输出用这些数构造Huffman树的总费用。


样例输入


5

5 3 8 2 9


样例输出


59


题解

#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
  int num,id;
public:
  bool operator <(const node& rhs)const{
    return num>rhs.num;
  }
};
int main() {
  priority_queue<int,vector<int>,greater<int> > q;
  cin >> n;
  int a,tot=n+1;
  for(int i = 1; i <= n; i++){
    cin>>a;
    q.push(a);
  }
  int sum = 0;
  while(q.size()>1){
    int top1 = q.top();q.pop();
    int top2 = q.top();q.pop();
    sum += (top1+top2);
    q.push(top1+top2);
  }
  cout<<sum<<endl;
}

4. 众数(map)


题目描述


所谓众数,就是对于给定的含有N个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数,多重集合S中的重数最大的元素称为众数。例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3。


对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数。


输入


第一行为n,表示测试数据组数。(n<30)

每组测试的第一行是一个整数m,表示多重集S中元素的个数为m

接下来的一行中给出m(m<100)个不大于10万的自然数

(不会出现不同元素出现的次数相同的情况,如:S={11,11,22,22,33,33})。


输出


每组测试数据输出一行,包含两个数,第一个是众数,第二个是其重数,中间以空格隔开。


样例输入


1

6

1 2 2 2 3 5


样例输出


2 3


题解

#include<bits/stdc++.h>
using namespace std;
int n, num;
map<int,int> mp;
int main() {
  int t;
  cin >> t;
  while(t--){
    mp.clear();
    cin >> n;
    for(int i = 0; i < n; i++){
      cin >> num;
      mp[num]++;  
    }
    int mx=0,cnt=0;
    for(auto i:mp){
      if(i.second > cnt){
        mx = i.first;
        cnt = i.second;
      }
    }
    cout<<mx<<" "<<cnt<<endl;
  }
}

5. 上网记录统计(map)


题目描述


在一个网络系统中有 n(0<n<100)个用户、m(0<m<1000)次上网记录。每个用户一个账号,是一个长度小于 20的字符串。每个账号每次上网都会浏览网页,网页名是以一个长度小于100 的字符串。假设日志文件记录了账号浏览网页记录,请根据这些记录统计每个账号浏览了哪些网页。


输入


测试数据有多组


每组测试数据格式如下:


m (上网记录数)


2~m+1行,每行一条记录: 账号 网页(中间以空格分隔。账号,网页中间没空格)


输出


对每组测试数据,输出各账号的访问网页信息(按访问顺序,中间以空格分隔,具体见输出样例)。各组数据间以空行分隔。


样例输入


10

liuyidao https://www.sohu.com/

liuyidao https://www.sina.com.cn/

shenzhenwa https://cloud.tencent.com/

liuyidao https://www.bilibili.com/

shenzhenwa https://www.baidu.com/

shendaxuezi www.cplusplus.com

shendaxuezi https://www1.szu.edu.cn/

liuyidao www.cplusplus.com

shendaxuezi www.cplusplus.com

shenzhenwa https://news.qq.com/mobile/


样例输出


liuyidao https://www.sohu.com/https://www.sina.com.cn/https://www.bilibili.com/ www.cplusplus.com

shenzhenwa https://cloud.tencent.com/https://www.baidu.com/https://news.qq.com/mobile/

shendaxuezi www.cplusplus.com https://www1.szu.edu.cn/ www.cplusplus.com


题解

#include<bits/stdc++.h>
using namespace std;
int n, m,tot;
map<string,int> table;
vector<string> names;
vector<string> mp[105];
int main() {
  while(cin >> m){
    names.clear();
    for(int i = 0; i < m;i++) mp[i].clear();
    tot=0;
    string name,web;
    for(int i = 0; i< m; i++){
      int now;
      cin>>name>>web;
      if(table.find(name)==table.end()){
        now = tot;
        table[name]=tot++;
        names.push_back(name);
      }else now = table[name];
      mp[now].push_back(web);
    }
    for(int i=0; i < tot; i++){
      cout<<names[i]<<" ";
      for(int j = 0;j<mp[i].size();j++){
        cout<<mp[i][j]<<" \n"[j==mp[i].size()-1];
      }
    }
    cout<<endl;   
  }
}
相关文章
|
28天前
|
存储 算法 C++
【C++初阶】STL详解(九) priority_queue的使用与模拟实现
【C++初阶】STL详解(九) priority_queue的使用与模拟实现
21 0
|
2月前
|
C++ 容器
【C++练级之路】【Lv.9】【STL】stack类和queue类的模拟实现
【C++练级之路】【Lv.9】【STL】stack类和queue类的模拟实现
|
2月前
|
算法 C++ 容器
【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现
【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现
|
7月前
|
算法 C++ 容器
C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)(下)
优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器
|
9月前
|
前端开发
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之4
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之4
33 0
|
7月前
|
存储 C++ 容器
C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)(上)
队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
|
9月前
|
前端开发
前端学习笔记202305学习笔记第二十八天-什么是对象结构 set map之13
前端学习笔记202305学习笔记第二十八天-什么是对象结构 set map之13
29 0
前端学习笔记202305学习笔记第二十八天-什么是对象结构 set map之13
|
9月前
|
前端开发
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之2
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之2
34 0
|
9月前
|
前端开发
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之5
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之5
32 0
|
9月前
|
前端开发
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之1
前端学习笔记202305学习笔记第二十五天-什么是对象结构 set map之1
39 0