洛谷刷题日记||基础篇9(线性表)

代码思路:

  1. 初始化圈:利用 std::list 保存编号为 1n 的人。
  2. 循环报数:利用迭代器模拟报数的过程,每次数到 m 时将对应的人出圈。
  3. 循环处理std::list::erase 删除出圈的人,并返回下一个人的迭代器,若迭代器越界则重新从头开始。
  4. 输出结果:记录并输出所有出圈人的编号。

#include <iostream>
#include <list> // 用于存储和操作循环链表
#include <vector> // 用于保存出圈顺序的结果
using namespace std;

int main() {
    int n, m;
    cin >> n >> m; // 输入 n 人数,m 报数上限

    // 1. 初始化环(使用 list 容器)
    list<int> circle; 
    for (int i = 1; i <= n; ++i) {
        circle.push_back(i); // 将编号 1 到 n 的人加入列表
    }

    // 2. 准备迭代器指向当前报数位置
    auto it = circle.begin(); 
    vector<int> result; // 用于存储出圈顺序

    // 3. 模拟报数直到所有人出圈
    while (!circle.empty()) {
        // 从当前迭代器位置开始数到第 m 个人
        for (int i = 1; i < m; ++i) { 
            ++it; // 移动迭代器到下一个人
            if (it == circle.end()) { 
                it = circle.begin(); // 如果到达列表尾部,则回到头部
            }
        }
        
        // 4. 记录数到 m 的人,并从列表中删除
        result.push_back(*it);      // 保存当前出圈人的编号
        it = circle.erase(it);      // 删除当前编号,并返回下一个位置的迭代器
        if (it == circle.end()) { 
            it = circle.begin();    // 若删除后迭代器越界,则回到列表开头
        }
    }

    // 5. 输出结果
    for (size_t i = 0; i < result.size(); ++i) {
        cout << result[i]; // 输出每个出圈人的编号
        if (i != result.size() - 1) { // 控制输出格式,避免最后一个编号后有空格
            cout << " ";
        }
    }
    cout << endl;

    return 0;
}

详细解读

初始化环
  • 使用 std::list 创建一个循环链表,适合频繁的插入和删除操作。
  • 编号从 1 到 n 加入列表,表示 n 个人围成一圈。
模拟报数
  1. 从指定位置开始报数

    • 使用迭代器 it 表示当前报数的人。
    • 每次移动迭代器 m−1 次找到第 m 个人。若到达列表尾部,则回到头部 (circle.begin()),模拟环形报数。
  2. 删除数到 mmm 的人

    • circle.erase(it) 删除当前迭代器指向的元素,并返回下一个有效迭代器。
    • 若删除的元素是最后一个,则重新从列表头部开始。
存储和输出结果
  • 每次删除时,将出圈人的编号加入 result 向量。
  • 最后按照题目要求,输出出圈编号,编号之间用空格隔开。


 

解题思路

  1. 后缀表达式的特点

    • 操作数直接入栈。
    • 遇到运算符时,从栈中取出两个操作数,进行运算,结果再入栈。
    • 最后栈中只剩下一个元素,即为表达式的结果。
  2. 输入解析

    • 操作数以 . 分隔。
    • 运算符为 + - * /
    • 结束符号为 @,标志表达式结束。
  3. 处理规则

    • 向 0 取整:对于 / 运算,C++ 中的 / 符号自动实现了向 0 取整,因此无需额外处理。

#include <iostream>
#include <stack> // 使用栈存储和处理操作数
#include <string> // 用于处理字符串
using namespace std;

int main() {
    string s;
    cin >> s; // 输入后缀表达式字符串

    stack<int> stk; // 定义一个栈,用于存储操作数
    int i = 0; // 用于遍历字符串的索引
    
    while (s[i] != '@') { // 遍历整个字符串,直到遇到结束符号 '@'
        if (isdigit(s[i])) { // 检查当前字符是否是数字
            int num = 0; // 用于保存完整的操作数
            while (isdigit(s[i])) { // 当连续的字符是数字时,解析完整的操作数
                num = num * 10 + (s[i] - '0'); // 构造数字,字符转换为整数
                i++; // 移动到下一个字符
            }
            stk.push(num); // 将完整的操作数压入栈
        } else if (s[i] == '.') { 
            // 遇到数字结束符 '.',直接跳过
            i++;
        } else { 
            // 当前字符是运算符,开始运算
            // 从栈中弹出两个操作数(注意先后顺序)
            int b = stk.top(); // 先弹出的是右操作数
            stk.pop();         // 删除栈顶元素
            int a = stk.top(); // 再弹出的是左操作数
            stk.pop();         // 删除栈顶元素

            int result = 0; // 用于保存运算结果
            if (s[i] == '+') { 
                result = a + b; // 加法运算
            } else if (s[i] == '-') { 
                result = a - b; // 减法运算
            } else if (s[i] == '*') { 
                result = a * b; // 乘法运算
            } else if (s[i] == '/') { 
                result = a / b; // 除法运算(向 0 取整,由 C++ 自动实现)
            }

            stk.push(result); // 将运算结果压入栈
            i++; // 移动到下一个字符
        }
    }

    // 栈中只剩下一个元素,即为表达式的最终结果
    cout << stk.top() << endl; // 输出结果

    return 0; // 程序结束
}



 逻辑:我们可以使用set储存当前位置前面所有元素,并自动排序。然后我们需要找到大于等于当前元素的位置和他的前一个位置(刚好小于当前元素),再取这两个元素分别与当前元素相减的绝对值的较小的一个作为他的最小波动值。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;

set<int> s;                // 用于动态维护已排序的营业额集合
set<int>::iterator k, a;   // 迭代器,用于定位最近的上下界
int n, x, ans = 0;         // n: 天数, x: 当前营业额, ans: 最小波动值总和

int main() {
    // 插入哨兵值,避免越界问题
    s.insert(192608170);   // 极大值哨兵
    s.insert(-192608170);  // 极小值哨兵

    // 读取天数
    scanf("%d", &n);

    // 遍历每一天的营业额
    for (register int i = 1; i <= n; ++i) {
        // 读取当天营业额
        scanf("%d", &x);

        // 特殊处理第一天(集合只包含哨兵时)
        if (s.size() == 2) {
            ans += x;       // 第一天的最小波动值直接为当天营业额
            s.insert(x);    // 将当天营业额插入集合
        } 
        else {
            // 查找第一个 >= x 的元素的迭代器
            k = s.lower_bound(x);

            // 如果当前值不存在于集合中,计算波动值并插入
            if (*k != x) {
                // 找到比 x 小的最大值的迭代器
                a = k;
                a--;  // 前移迭代器,获取下界
                
                // 计算波动值:min(|*a - x|, |*k - x|)
                ans += min(abs(*a - x), abs(*k - x));

                // 插入当天营业额到集合
                s.insert(x);
            }
        }
    }

    // 输出最终结果
    printf("%d\n", ans);
    return 0;
}

register int 是 C++ 中的一个变量声明修饰符,其中 register 用来建议编译器将变量存储在 CPU 寄存器中,而不是在内存中,以提高访问速度。



 

 我们可以把每相邻的的两个同学想象成他们牵着手(如图)

 然后经过换手打到插入的效果

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;

const int mx = 1e5 + 10;  // 最大的同学数量

int n, m;  // n 是同学的总数,m 是需要删除的同学数量

// 定义一个结构体 T,用于表示每个同学的队列关系
struct T {
    int l, r;  // 每个同学的左右“手”,即指向左边和右边同学的编号
    int d;     // d 为 1 时,表示该同学不需要输出,默认为 0 表示需要输出
} t[mx] = {0};  // 初始化所有同学的关系和标记

// add 函数:用于将第 k 个同学插入到队列中的第 i 个同学的左边或右边
void add(int i, int k, int f) {
    if (f == 1) {  // f == 1 表示插入到第 i 同学的右边
        t[k].r = t[i].r;  // k 同学的右边是 i 同学右边的同学
        t[k].l = i;  // k 同学的左边是 i 同学
        t[i].r = k;  // i 同学的右边是 k 同学
        t[t[k].r].l = k;  // k 同学右边的同学的左边是 k
    }
    else {  // f == 0 表示插入到第 i 同学的左边
        t[k].r = i;  // k 同学的右边是 i 同学
        t[k].l = t[i].l;  // k 同学的左边是 i 同学左边的同学
        t[i].l = k;  // i 同学的左边是 k 同学
        t[t[k].l].r = k;  // k 同学左边的同学的右边是 k
    }
}

int main() {
    int x, k, f;
    cin >> n;  // 输入同学的总数

    // 初始化队列,t[0] 表示队列的虚拟头结点
    t[0].r = 0;
    t[0].l = 0;
    
    // 将第一个同学插入队列中(通过 add 函数)
    add(0, 1, 1);  // 将 1 号同学插入到 0 号同学的右边

    // 处理每个同学的入队操作
    for (int i = 2; i <= n; i++) {  // 从 2 到 n 号同学
        cin >> x >> f;  // 输入插入的位置(x 号同学)和插入方向(f:0 表示左,1 表示右)
        add(x, i, f);  // 将 i 号同学插入到 x 号同学的左边或右边
    }

    cin >> m;  // 输入需要删除的同学数量

    // 处理删除操作
    while (m--) {
        cin >> x;  // 输入要删除的同学编号
        t[x].d = 1;  // 将该同学标记为不输出
    }

    // 输出队列中未被删除的同学
    for (int i = t[0].r; i; i = t[i].r) {  // 从队列的第一个同学开始遍历
        if (t[i].d == 0)  // 如果该同学未被删除(d == 0)
            cout << i << " ";  // 输出该同学的编号
    }

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch开启认证及kibana密码登陆

Elasticsearch不允许root用户运行,使用root用户为其创建一个用户es,为用户es配置密码,并切换到es用户。 adduser elastic passwd elastic su elasticElasticsearch(简称ES)是一个基于Lucene的搜索服务器。它提供了一个分布式、多用户能力的全文搜索引擎,基于RESTful web…

ESLint的简单使用(js,ts,vue)

一、ESLint介绍 1.为什么要用ESLint 统一团队编码规范&#xff08;命名&#xff0c;格式等&#xff09; 统一语法 减少git不必要的提交 减少低级错误 在编译时检查语法&#xff0c;而不是等js引擎运行时才检查 2.eslint用法 可以手动下载配置 可以通过vue脚手架创建项…

学习threejs,使用AnimationMixer实现变形动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.AnimationMixer 动画…

嵌入式驱动开发详解1(系统调用)

文章目录 符设备驱动架构read函数详解用户层read函数内核层read函数 具体实现用户层代码 内核层代码细节分析 符设备驱动架构 如上图所示&#xff0c;应用层程序直接用系统提供的API函数即可调用驱动层相应的函数&#xff0c;中间的具体过程都是由linux内核实现的&#xff0c;…

算法.图论-习题全集(Updating)

文章目录 本节设置的意义并查集篇并查集简介以及常见技巧并查集板子(洛谷)情侣牵手问题相似的字符串组岛屿数量(并查集做法)省份数量移除最多的同行或同列石头 本节设置的意义 主要就是为了复习图论算法, 尝试从题目解析的角度,更深入的理解图论算法… 并查集篇 并查集简介以…

解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题

解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题 Chapter1 解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题 Chapter1 解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题 目前使用的是三星4K显示屏&#xff0c;屏幕分辨率太高了&#xff0c;导致VMWare Workst…

第27天 安全开发-PHP应用TP 框架路由访问对象操作内置过滤绕过核心漏洞

时间轴 演示案例 TP 框架-开发-配置架构&路由&MVC 模型 TP 框架-安全-不安全写法&版本过滤绕过 TP 框架-开发-配置架构&路由&MVC 模型 参考&#xff1a; https://www.kancloud.cn/manual/thinkphp5_1 1、配置架构-导入使用 去thinkphp官网可以看到&…

Mac的Terminal随机主题配置

2024年8月8日 引言 对于使用Mac的朋友&#xff0c;如果你是一个程序员&#xff0c;那肯定会用到Terminal。一般来说Terminal就是一个黑框&#xff0c;但其实Terminal是有10款官方皮肤。 每个都是不一样的主题&#xff0c;颜色和字体都会有所改变。现在就有一个方法可以很平均…

开源项目低代码表单设计器FcDesigner获取表单的层级结构与组件数据

在使用开源项目低代码表单设计器FcDesigner时&#xff0c;获取和理解表单的层级结构非常关键。通过getDescription和getFormDescription方法&#xff0c;您可以清晰掌握表单组件的组织结构和层次关系。这些方法为操控表单的布局和配置提供了强大的支持。 源码地址: Github | G…

ReactPress vs VuePress vs RectPress

ReactPress&#xff1a;重塑内容管理的未来 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。ReactPress作为一款融合了现代Web开发多项先进技术的开源发布平台&#xff0c;正以其卓越的性能、灵活性和可扩展性&…

无人机在森林中的应用!

一、森林资源调查 无人机可以利用遥感技术快速获取所需区域高精度的空间遥感信息&#xff0c;对森林图斑进行精确区划。相较于传统手段&#xff0c;无人机调查具有低成本、高效率、高时效的特点&#xff0c;尤其在地理环境条件不好的区域&#xff0c;调查人员无法或难以到达的…

RTC纽扣电池寿命问题分析

一、 问题描述 一款带RTC功能的终端产品&#xff0c;RTC使用寿命设计要求高于5年&#xff0c;产品研发后测试&#xff0c;发现VDD_BATT的电流大于100uA&#xff0c;导致产品实际计算出来寿命只有半年之久&#xff0c;下图是RTC电路图&#xff1a; 图1 RTC供电电路 二、 原因分…

python成长技能之正则表达式

文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式&#xff08;英语&…

ElasticSearch学习笔记三:基础操作(一)

一、前言 上一篇文章中&#xff0c;我们学习了如何使用Java客户端去连接并且简单的操作ES&#xff0c;今天我们将对ES中的基本操作进行学习&#xff0c;包括索引操作、映射操作、文档操作。 二、索引操作 简单回顾一下索引&#xff0c;ES中的索引就有相同结构的数据的集合&a…

【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;提示词英文模板&#x1f4af;提示词中文解析1. 明确需求2. 建议额外角色3. 角色确认与修改4. 逐步完善提示5. 确定参考资料6. 生成和优化提示7. 生成最终响…

通过华为鲲鹏认证发行上市的集成平台产品推荐

华为鲲鹏认证是技术实力与品质的权威象征&#xff0c;代表着产品达到了高标准的要求。从技术层面看&#xff0c;认证确保产品与华为鲲鹏架构深度融合&#xff0c;能充分释放鲲鹏芯片的高性能、低功耗优势&#xff0c;为集成平台的高效运行提供强大动力。在安全方面&#xff0c;…

500左右的骨传导耳机哪个牌子好?用户体验良好的五大骨传导耳机

作为一名拥有十几年从业经验的科技爱好者&#xff0c;我主要想告诉大家一些关于骨传导耳机的知识。其中&#xff0c;要远离所谓的不专业产品&#xff0c;它们的佩戴不适和音质不佳问题高得吓人&#xff0c;尤其是很多宣称能提供舒适佩戴和高音质的产品&#xff0c;超过九成的用…

【MySQL】RedHat8安装mysql9.1

一、下载安装包 下载地址&#xff1a;MySQL Enterprise Edition Downloads | Oracle MySQL :: MySQL Community Downloads 安装包&#xff1a;mysql-enterprise-9.1.0_el8_x86_64_bundle.tar 官方 安装文档&#xff1a;MySQL Enterprise Edition Installation Guide 二、安装…

Java项目实战II基于Java+Spring Boot+MySQL的共享汽车管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在共享经济…

three.js 对 模型使用 视频进行贴图修改材质

three.js 对 模型使用 视频进行贴图修改材质 https://threehub.cn/#/codeMirror?navigationThreeJS&classifyapplication&idvideoModel import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GLTFLoad…