【三十七】【算法分析与设计】STL 练习,凌波微步,栈和排序,吐泡泡,[HNOI2003]操作系统,优先队列自定义类型

news2024/10/6 14:33:37

凌波微步

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网

时间限制:C/C++ 1 秒,其他语言 2 秒

空间限制:C/C++ 32768K,其他语言 65536K

64bit IO Format: %lld

题目描述

小 Z 的体型实在是太胖了,每次和小 D 一起出门都跟不上小 D 的脚步,这让小 Z 很气馁,于是小 Z 跋山涉水,仿名山,遍古迹,终于找到了逍遥派。掌门看小 Z 求师虔诚,决定传小 Z 一套《凌波微步》。

这种腿法可以无视距离的行进,但缺点是只能走向高处,否则强行发功极易走火入魔。

一天,练习《林波微步》的小 Z 来到一处练武场,这里从左到右,共有 n 个木桩,这些木桩有高有低,在这里小 Z 勤奋的练习着凌波微步,你知道小 Z 在这处练武场最多能练习多少次么?

输入描述:

本题有 T 组数据。

对于每组数据第一行有一个正整数 n 表示有多少个木桩。

第二行有 n 个数 a_i,表示木桩与水平地面的相对高度。

1≤T≤10

1≤n≤100000

1≤a_i≤1000000000

输出描述:

输出结果,并换行。

示例 1

输入

复制 2 6 1 2 3 4 5 6 5 1 3 5 3 6

2

6

1 2 3 4 5 6

5

1 3 5 3 6

输出

复制 6 4

6

4

说明

第一组: 1->2->3->4->5->6 共 6 步

第二组: 1->3->5->6 共 4 步

题目要求我们对木桩进行去重和计数。

set容器的性质是去重+排序。

依次将数据insertset中,然后输出size个数即可。

 
#include<bits/stdc++.h>
using namespace std;
int main(){
    int T; cin >> T;
        for (int i = 1; i <= T; i++) {
                int n; int ret = 0;
                cin >> n;
                set<int> a;
                for (int j = 1; j <= n; j++) {
                        int a_i; cin >> a_i;
                        a.insert(a_i);
                }
        ret=a.size();
                cout << ret <<endl;
        }
}

栈和排序

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网

时间限制:C/C++ 1 秒,其他语言 2 秒

空间限制:C/C++ 131072K,其他语言 262144K

64bit IO Format: %lld

题目描述

给你一个 1->n 的排列和一个栈,入栈顺序给定

你要在不打乱入栈顺序的情况下,对数组进行从大到小排序

当无法完全排序时,请输出字典序最大的出栈序列

输入描述:

第一行一个数 n

第二行 n 个数,表示入栈的顺序,用空格隔开,结尾无空格

输出描述:

输出一行 n 个数表示答案,用空格隔开,结尾无空格

示例 1

输入

复制 5 2 1 5 3 4

5

2 1 5 3 4

输出

复制 5 4 3 1 2

5 4 3 1 2

说明

2 入栈;1 入栈;5 入栈;5 出栈;3 入栈;4 入栈;4 出栈;3 出栈;1 出栈;2 出栈

我们的目的是尽可能在可以输出的元素中,输出最大值元素。

可以输出的元素是指栈顶元素,和还没有入栈的元素。

每一次都是在这个集合中输出最大值。

如果目标值位于栈顶,直接输出。如果目标值位于还没入栈的集合中,需要不断入栈直到目标元素位于栈顶。

我们用 a 存储入栈序列。

定义 waiting 存储还没有处理的元素。

宏观的思想,依次处理元素,直到 waiting 集合中没有元素为止。

定义 ans 存储结果序列。

定义 stk 模拟入栈出栈操作。

依次将 waiting 中还没有处理的元素入栈进行处理。

处理内部逻辑,判断是否是目标元素,如果是目标元素,则栈顶元素要大于未处理集合中的所有元素。waiting 集合用 set 容器存储。只需要比较栈顶元素和未处理集合中最后一个元素的大小就可以知道是不是目标元素。

如果是目标元素,添加到 ans 中,然后出栈。

可以想象 stk 和 ans 整体是已经处理的集合。

处理完毕时,目标元素位于未处理集合中。

 
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    stack<int> stk;
    vector<int> ans;
    set<int> waiting;

    for (int i = 1; i <= n; ++i) {
        waiting.insert(i);
    }

    for (int i = 0; i < n; ++i) {
        stk.push(a[i]);
        waiting.erase(a[i]);

        while (!stk.empty() && !waiting.empty() && *waiting.rbegin() < stk.top()) {
            ans.push_back(stk.top());
            stk.pop();
        }
    }

    while (!stk.empty()) {
        ans.push_back(stk.top());
        stk.pop();
    }

    for (int i = 0; i < n; ++i) {
        cout << ans[i] << " ";
    }

    return 0;
}

吐泡泡

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网

时间限制:C/C++ 1 秒,其他语言 2 秒

空间限制:C/C++ 32768K,其他语言 65536K

64bit IO Format: %lld

题目描述

小鱼儿吐泡泡,嘟嘟嘟冒出来。小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o"。

两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉。

(是的你没看错,小气泡和大气泡不会产生任何变化的,原因我也不知道。)

例如:ooOOoooO 经过一段时间以后会变成 oO。

输入描述:

数据有多组,处理到文件结束。

每组输入包含一行仅有'O'与'o'组成的字符串。

输出描述:

每组输出仅包含一行,输出一行字符串代表小鱼儿吐出的泡泡经过融合以后所剩余的泡泡。

示例 1

输入

复制 ooOOoooO

ooOOoooO

输出

复制 oO

oO

说明

自左到右进行合并

备注:

对于 100%的数据,

字符串的长度不超过 100。

定义 a 集合中,全是融合好的元素集合。

将 s 中未处理的元素,依次加入到 a 集合中。

加入一个未处理的元素之后,维护 a 集合定义,全都是融合好的元素。

维护定义内部逻辑,如果最后两个字符相同,进行处理。处理完之后还需要判断最后两个,直到最后两个元素不同为止。处理细节,确保有两个元素,判断 size 是否大于等于 2。

静态定义,a 集合都是处理好的元素,另一个集合是还没有处理的元素。

依次将还没有处理的元素,放到 a 集合中,然后维护 a 集合的定义。直到还没有处理的集合为空集,此时 a 集合就是全部元素处理好的集合。

 
#include<bits/stdc++.h>
using namespace std;

int main() {
        string s;
        while (cin >> s) {
                vector<char> a;
                int n = s.length();
                for (int i = 0; i < n; ++i) {
                        a.push_back(s[i]);
                        while (a.size()>=2 && a[a.size() - 1] == a[a.size() - 2]) {
                                char ch;
                                ch = a[a.size() - 1];
                                a.pop_back();
                                a.pop_back();
                                if (ch == 'o')a.push_back('O');
                        }
                }
                for (int i = 0; i < a.size(); ++i) {
                        cout << a[i];
                }
                cout << endl;
        }
}

[HNOI2003]操作系统

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网

时间限制:C/C++ 1 秒,其他语言 2 秒

空间限制:C/C++ 262144K,其他语言 524288K

64bit IO Format: %lld

题目描述

写一个程序来模拟操作系统的进程调度。假设该系统只有一个 CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的。其中运行优先级用自然数表示,数字越大,则优先级越高。

如果一个进程到达的时候 CPU 是空闲的,则它会一直占用 CPU 直到该进程结束。除非在这个过程中,有一个比它优先级高的进程要运行。在这种情况下,这个新的(优先级更高的)进程会占用 CPU,而老的只有等待。

如果一个进程到达时,CPU 正在处理一个比它优先级高或优先级相同的进程,则这个(新到达的)进程必须等待。一旦 CPU 空闲,如果此时有进程在等待,则选择优先级最高的先运行。如果有多个优先级最高的进程,则选择到达时间最早的。

输入描述:

输入文件包含若干行,每一行有四个自然数(均不超过 108),分别是进程号,到达时间,执行时间和优先级。不同进程有不同的编号,不会有两个相同优先级的进程同时到达。

输入数据已经按到达时间从小到大排序。输入数据保证在任何时候,等待队列中的进程不超过 15000 个。

输出描述:

按照进程结束的时间输出每个进程的进程号和结束时间

示例 1

输入

复制 1 1 5 3 2 10 5 1 3 12 7 2 4 20 2 3 5 21 9 4 6 22 2 4 7 23 5 2 8 24 2 4

1 1 5 3

2 10 5 1

3 12 7 2

4 20 2 3

5 21 9 4

6 22 2 4

7 23 5 2

8 24 2 4

输出

复制 1 6 3 19 5 30 6 32 8 34 4 35 7 40 2 42

1 6

3 19

5 30

6 32

8 34

4 35

7 40

2 42

宏观思维,未处理的集合,已经处理完毕的集合。

定义 pq 优先队列存储 cpu 待处理的进程集合。

定义 waiting 存储还没有到达的进程集合。

如果 waiting 集合为空集,pq 优先队列依次处理即可。所以我们的目标可以是将还没有到达的进程集合变为空集。

定义 now_time 表示现在的时间。

现在的时间,到下一个进程到达的时间,这段时间内 cpu 可以一直工作。

这时有两种情况,第一种情况,当前进程处理完了,下一个进程还没到。

第二种情况,当前进程还没处理完,下一个进程就到了。

 
#include <bits/stdc++.h>
using namespace std;

class process {
public:
    int id;         // 进程ID
    int start_time; // 开始时间
    int life;       // 生命周期
    int priority;   // 优先级


    process(int id_, int start_time_, int life_, int priority_)
        : id(id_), start_time(start_time_), life(life_), priority(priority_) {}


    bool operator<(const process& p) const {
        if (priority == p.priority)
            return start_time > p.start_time;
        return priority < p.priority;
    }
};

int main() {
    priority_queue<process> pq;
    vector<process> waiting;

    int id, start_time, life, priority;
    while (cin >> id >> start_time >> life >> priority) {
        waiting.push_back(process(id, start_time, life, priority));
    }

    int now_time = 0;
    int index = 0;

    while (index < waiting.size() || !pq.empty()) {

        while (index < waiting.size() && waiting[index].start_time <= now_time) {
            pq.push(waiting[index]);
            index++;
        }

        if (!pq.empty()) {
            process current = pq.top();
            pq.pop();
            int next_arrival_time = (index < waiting.size()) ? waiting[index].start_time : INT_MAX;
            int execute_time = min(current.life, next_arrival_time - now_time);
            now_time += execute_time;
            current.life -= execute_time;
            if (current.life == 0) {
                cout << current.id << " " << now_time << endl;
            } else {
                pq.push(current);
            }
        } else {

            now_time = waiting[index].start_time;
        }
    }

    return 0;
}

优先队列自定义类型

在 C++中,自定义类型的优先队列可以通过使用std::priority_queue结构实现,它是 C++标准库中的一部分。为了让std::priority_queue支持自定义类型,您需要定义比较方式,这通常通过重载运算符或提供自定义比较函数(比如函数对象)来完成。下面,我将给出两种方法来实现带有自定义类型的优先队列。

方法 1:重载<运算符

如果您的自定义类型可以自然地定义一个“小于”关系,则可以通过重载<运算符来实现比较逻辑。std::priority_queue默认使用std::less作为比较方式,这意味着元素将按照从大到小的顺序排序(即最大元素位于队列前端)。

重载<运算符的意义是判断前者是否是小于后者。

 
#include <iostream>
#include <queue>

class MyObject {
public:
    int value;
    MyObject(int val) : value(val) {}

    // 重载<运算符
    bool operator<(const MyObject& other) const {
        return value < other.value; // 更大的值具有更高的优先级
    }
};

int main() {
    std::priority_queue<MyObject> myQueue;

    myQueue.push(MyObject(10));
    myQueue.push(MyObject(5));
    myQueue.push(MyObject(20));

    while (!myQueue.empty()) {
        MyObject obj = myQueue.top();
        std::cout << obj.value << std::endl;
        myQueue.pop();
    }

    return 0;
}

方法 2:使用自定义比较函数

如果您不想或不能修改自定义类型来重载运算符,或者需要在不同的情况下使用不同的排序准则,您可以通过定义一个比较函数对象来实现。

std::priority_queue<MyObject, std::vector<MyObject>, CompareMyObject> myQueue;

优先队列底层是堆,中间都是用 vector<自定义类型>作为容器即可。

第三个位置填写自定义比较的类。

自定义比较的类重载的是 ()。

 
#include <iostream>
#include <queue>
#include <vector>

class MyObject {
public:
    int value;
    MyObject(int val) : value(val) {}
};

// 自定义比较函数对象
class CompareMyObject {
public:
    bool operator()(const MyObject& obj1, const MyObject& obj2) {
        return obj1.value < obj2.value; // 更大的值具有更高的优先级
    }
};

int main() {
    std::priority_queue<MyObject, std::vector<MyObject>, CompareMyObject> myQueue;

    myQueue.push(MyObject(10));
    myQueue.push(MyObject(5));
    myQueue.push(MyObject(20));

    while (!myQueue.empty()) {
        MyObject obj = myQueue.top();
        std::cout << obj.value << std::endl;
        myQueue.pop();
    }

    return 0;
}

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1575140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UML 绘制工具 starUML 入门介绍

拓展阅读 常见免费开源绘图工具 OmniGraffle 创建精确、美观图形的工具 UML-架构图入门介绍 starUML UML 绘制工具 starUML 入门介绍 PlantUML 是绘制 uml 的一个开源项目 UML 等常见图绘制工具 绘图工具 draw.io / diagrams.net 免费在线图表编辑器 绘图工具 excalidr…

备份也能给你搞出点问题来

为什么做备份 为了防止数据丢失&#xff0c;防止一些灾难等等。管理上以及一些监管机构都对备份有要求。有的甚至要求保留几十天甚至180的要求。这些是为了防止故障&#xff0c;但是也有不少时候&#xff0c;没备份还没故障&#xff0c;结果备份导致了故障。 我就遇到过几次因…

【JAVASE】面向对象程序三大特性之一( 封装)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609;\n &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1.包的使用 2.static关键字的使用 3.代码…

Godot插值、贝塞尔曲线和Astar寻路

一、插值 线性插值是采用一次多项式上进行的插值计算&#xff0c;任意给定两个值A和B&#xff0c;那么在A和B之间的任意值可以定义为&#xff1a;P(t) A * (1 - t) B * t&#xff0c;0 < t < 1。 数学中用于线性拟合&#xff0c;游戏应用可以做出跟随效果&#xff08;…

揭开“栈和队列”的神秘面纱

前言 在线性表中不止有顺序表和链表&#xff0c;今天的主角就如标题所说--->认识栈和队列。把他们俩放一起总结是有原因的&#xff0c;还请看官听我娓娓道来~ 什么是栈&#xff1f; 栈&#xff08;stack&#xff09;是限定仅在表尾进行插入和删除操作的线性表 咱可以把栈理…

书生·浦语大模型实战营之茴香豆:搭建你的 RAG 智能助理

书生浦语大模型实战营之茴香豆&#xff1a;搭建你的 RAG 智能助理 RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇…

Redis中的Sentinel(五)

Sentinel 检测主观下线状态 在默认情况下&#xff0c;Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他Sentinel在内) 发送PING命令&#xff0c;并通过实例返回的PING命令回复来判断实例是否在线。如图所示&#xff0c;带箭头的连线显…

CAS单点登录简介

1、传统cookie认证 通常在登录的时候&#xff0c;前端将用户名和密码传送给后端&#xff0c;然后后端将加密后的认证字符串设置成cookie&#xff0c;在以后的每次请求中&#xff0c;都会将cookie发过去&#xff0c;再解密校验请求者的信息&#xff0c;或者进行一系列的鉴权。 这…

【C++ STL容器适配器】stack 栈

文章目录 【 1. 基本原理 】【 2. stack 的创建 】2.1 创建一个空的的 stack 适配器&#xff0c;并采用默认的 deque 基础容器2.2 指定其他序列式容器2.3 通过基础容器初始化 stack2.4 通过一个 stack 初始化另一个 stack 【 3. stack 支持的成员函数 】 【 1. 基本原理 】 st…

实测STM32的RTC,什么校准都不做,不断电,半年后快了13分钟

【测试结果】 TOOL的RTC时钟一直都是通过上位机这里手动校准的&#xff0c;这次做了了实验&#xff0c;测试期间不做任何校准&#xff0c;看看半年后效果。 测试是从去年的9月29号开始 截至到今年的4月5号&#xff0c;快了13分钟 【误差原因】 因为晶振对温度敏感&#xff0…

windows 系统下 mysql 数据库的下载与安装(包括升级安装)

windows 系统下 mysql 数据库的下载与安装&#xff08;包括升级安装&#xff09; 一、mysql 介绍&#xff1a; MySQL 是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。 MySQL 是最流行的关系型数据库管理系统之一&#xf…

算法 第34天 贪心3

1005 K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可能…

Unity Meta Quest MR 开发(五):空间锚点

文章目录 &#x1f4d5;教程说明 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量 XR 开发者社区&#xff0c;博主目前在内担任 XR 开发的讲师。该社区提供专人答疑、完整进阶教程、从零到一项目孵化保姆服务&…

华为海思2024春招数字芯片岗机试题(共9套)

huawei海思2024春招数字芯片岗机试题(共9套&#xff09;&#xff08;WX:didadidadidida313&#xff0c;加我备注&#xff1a;CSDN huawei数字题目&#xff0c;谢绝白嫖哈&#xff09; 题目包含数字集成电路、System Verilog、Verilog2001、半导体制造技术、高级ASIC芯片综合、…

微信小程序使用自己的布局

我第一天学习微信小程序&#xff0c;照着黑马程序员老师的操作模仿编辑。因为视频是23年的&#xff0c;我24年4月份学习发现很多地方不一样了。 新版微信开发者工具中没有自带wxss文件。我自己建了一个list.wxss文件&#xff0c;发现用不了&#xff0c;在list.wxml文件中编写v…

安卓java打包uniapp原生插件 和 uniapp使用安卓android原生插件

1.uniapp dcloud官方文档 简介 | uni小程序SDK 2.前提&#xff0c;需要有经验的安卓java开发人员&#xff0c;并且同时具备uniapp移动端开发经验。说明&#xff1a;android打包的.aar和uniapp需要的.aar是不一样的&#xff0c;uniapp需要的.aar是需要有一些特定配置的&#x…

vue结合Elempent-Plus/UI穿梭框更改宽度以及悬浮文本显示

由于分辨率不同会导致文本内容显示不全&#xff0c;如下所示&#xff1a; 因此需要 1、悬浮到对应行上出现悬浮信息 实现代码如下所示&#xff1a; 这里只演示Vue3版本代码&#xff0c;Vue2版本不再演示 区别就在插槽使用上Vue3使用&#xff1a;#default“”&#xff1b;Vu…

阿里云服务器租赁一年收费标准

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

C#基础:类,对象,类成员简介(第四节课)

本节内容&#xff1a; 类与对象的关系 什么时候叫“对象”&#xff0c;什么时候叫实例引用变量与实例的关系 类的三大成员 属性方法事件 类的静态成员与实例成员 关于“绑定” 1.什么是类&#xff1a;&#xff08;再详细一点&#xff09; 类是对现实世界事物进行抽象所…

蓝桥杯练习系统(算法训练)ALGO-959 P0705 集合运算

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 输入两个整数集合A、B&#xff0c;求出他们的交集、并集以及B在A中的余集。交集、并集和余集的计算都要求写成一个单独的函数。   输…