ZISUOJ 2024算法基础公选课练习一(1)

news2024/11/26 12:31:41

前言、

        又是一年算法公选课,与去年不同的是今年学了一些纯C++(而不是带类的C)

一、我的C++模板

1.1 模板1

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    return 0;
}

1.2 模板2

#include <bits/stdc++.h>
using i64 = long long;

void solve() {
    
}
int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int t = 1;
    //如果有多组数据,则放开下一行的注释
    // std::cin >> t;
    while(t--) {
        solve();
    }
    return 0;
}

二、题目总览

三、具体题目

        3.1 问题 A: 删数问题(Tan1):

思路:

        用贪心算法(属于不是很容易察觉的那种)。跑k次循环,每次循环找出第一个逆序对,此时需要删去的就是逆序对中的第一个数(较大的那个);如果找不到逆序对,那么删除最后一个数。另外,特判出现前导零的情况,既可以用string的erase()方法,也可以用reverse()函数反转字符串,再使用pop_back()函数(主要是因为没有pop_front()函数,猜测string是拿vector实现的,而不是deque)。

参考代码1:

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    std::string a;int k;
    std::cin >> a >> k;
    for(int i = 0;i<k;i++) {
        int idx = 0;
        while(idx<a.size()-1&&a[idx]<=a[idx+1]) idx++;
        if(idx!=a.size()-1) {
            a.erase(idx,1);
        }else {
            a.erase(a.size()-1,1);
        }
    }
    while(a.front()=='0'&&a.size()>1) {
        a.erase(0,1);
    }
    std::cout << a << '\n';

    return 0;
}

参考代码2:

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    std::string a;int k;
    std::cin >> a >> k;
    for(int i = 0;i<k;i++) {
        int idx = 0;
        while(idx<a.size()-1&&a[idx]<=a[idx+1]) idx++;
        if(idx!=a.size()-1) {
            a.erase(idx,1);
        }else {
            a.erase(a.size()-1,1);
        }
    }
    std::string ans = a;
    std::reverse(ans.begin(),ans.end());
    while(ans.back()=='0'&&ans.size()>1){
        ans.pop_back();
    }
    std::reverse(ans.begin(),ans.end());
    std::cout << ans << '\n';

    return 0;
}

        3.2 问题 B: 输出亲朋字符串:

思路:

        没啥好说的,模拟一下就行,如果打算直接在原字符串上修改,那么需要暂存第一个字符

参考代码:

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    std::string s;
    std::getline(std::cin,s);
    char tmp = s[0];
    for(int i = 0;i<s.size();i++) {
        if(i!=s.size()-1) {
            s[i]+=s[i+1];
        }else {
            s[i]+=tmp;
        }
    }
    std::cout << s << '\n';

    return 0;
}

        3.3 问题 C: 密钥加密:

思路:

        注意题中的两个模运算,因为字符串可能存在空格,所以读数据用getline()来读

参考代码:

这里有两个小技巧

 1.字符'0'到'9'转数字,我们可以直接异或48,同理,数字转字符'0'到'9'也可以直接异或48得到

  2.string下标从0开始,我们可以让它的前面拼接一个字符(通常是空格),这样它有意义的字符下标就从1开始,当然输出的时候记得把第一个字符去掉再输出

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    std::string key,str;
    while(std::getline(std::cin,key)&&std::getline(std::cin,str)) {
        int len_key = key.size();
        int len_str = str.size();

        std::vector<int> real_key;
        real_key.emplace_back(key[len_key-1]^48);
        for(int i = 0;i<len_key-1;i++) {
            real_key.emplace_back(key[i]^48);
        }

        str = " "+str;
        for(int i = 1;i<=str.size();i++) {
            str[i] = str[i]+real_key[i%len_key];
            str[i] = str[i]>122?str[i]-91:str[i];
        }
        str.erase(0,1);

        std::cout << str << '\n';
    }

    return 0;
}

        3.4 问题 D: 排列对称串:

思路:

如果一个字符串前后反转还等于反转前的值,那么它就是对称的字符串,把对称的字符串放进vector,然后排序一下,排序可以写cmp()函数,也可以用C++11的语法糖-匿名函数(我下面的代码是拿匿名函数写的),最后输出vector的内容即可

参考代码:

小技巧:

基于范围的for循环也是C++11的新语法糖,可以遍历一个容器,减少代码书写量

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    std::vector<std::string> v;
    std::string str;

    while(std::getline(std::cin,str)) {
        std::string reverse_str = str;
        std::reverse(reverse_str.begin(),reverse_str.end());
        if(reverse_str==str) {
            v.emplace_back(str);
        }
    }

    std::sort(v.begin(),v.end(),[&](const std::string &s1,const std::string &s2)->bool {
        if(s1.size()!=s2.size()) return s1.size()<s2.size();
        return s1<s2;
    });

    for(auto &vi:v) {
        std::cout << vi << '\n';
    }

    return 0;
}

3.5 问题 E: 《庆余年》之四大宗师:

思路:

利用哈希表先把每个人的积分算出来,然后拷贝到vector中排序(因为哈希表不支持排序),然后根据要求排序,排序好后输出即可

参考代码:

小技巧:

拷贝可以用copy()函数实现,也可以写一个for循环,然后把数据emplace_back进vector

#include <bits/stdc++.h>
using i64 = long long;
using psi = std::pair<std::string,int>;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    std::unordered_map<std::string,int> mp;
    std::string player1,player2,result;

    for(int t = 0;t<6;t++) {
        std::cin >> player1 >> player2 >> result;
        if(result=="S") {
            mp[player1]+=3;
        }else if(result=="F") {
            mp[player2]+=3;
        }else {
            mp[player1]+=1;
            mp[player2]+=1;
        }
    }

    std::vector<psi> v(mp.size());
    std::copy(mp.begin(),mp.end(),v.begin());

    std::sort(v.begin(),v.end(),[&](const psi &p1,const psi &p2)->bool {
        if(p1.second!=p2.second) return p1.second>p2.second;
        return p1.first<p2.first;
    });

    for(auto &player:v) {
        std::cout << player.first << '\n';
    }

    return 0;
}

后记:

我写了很多C++11的语法糖,C++新版本出了越来越多的语法糖,存在即合理。新语法糖肯定有优秀的地方,我们在书写代码的时候应该尽可能多地使用新语法

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

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

相关文章

【1】虚拟机安装

1.安装VMware WorkStation Pro VMware下载地址&#xff1a; 密钥&#xff1a;YF390-0HF8P-M81RQ-2DXQE-M2UT6 2.新建虚拟机 centos7下载地址&#xff1a;centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云

【SpringBoot】SpringBoot自带的Jackson入门使用

导入依赖 springboot自带的&#xff0c;挨个点进去&#xff0c;就能找到 自定义对象转换器 import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModu…

软件工程概论项目(一),git环境的配置和平台代码的拉取

距离软工概论项目答辩还有五个周的时间&#xff0c;需要做一个项目&#xff0c;把心得体会都做一个记录。以便以后进行回顾和反思 这里写目录标题 一、环境的配置gitbash 一、环境的配置 gitbash 安装gitbash&#xff0c;简单说两句&#xff0c;git用于多人协作和代码托管&am…

分布式数据库中间件mycat

MyCat MyCat是一个开源的分布式数据库系统&#xff0c;它实现了MySQL协议&#xff0c;可以作为数据库代理使用。 MyCat(中间件)的核心功能是分库分表&#xff0c;即将一个大表水平分割为多个小表&#xff0c;存储在后端的MySQL服务器或其他数据库中。 它不仅支持MySQL&#xff…

万字长文解读深度学习——循环神经网络RNN、LSTM、GRU、Bi-RNN

&#x1f33a;历史文章列表&#x1f33a; 深度学习——优化算法、激活函数、归一化、正则化深度学习——权重初始化、评估指标、梯度消失和梯度爆炸深度学习——前向传播与反向传播、神经网络&#xff08;前馈神经网络与反馈神经网络&#xff09;、常见算法概要汇总万字长文解读…

一文了解什么是腾讯云开发

关于云开发的猜想 说到云开发&#xff0c;作为开发者的大家是否大概就有了想法。比如说过去的开发工作都是在自己本地电脑的开发工具&#xff0c;比如IDEA开发工具进行开发的&#xff0c;开发完成后再部署到服务器测试以及上线。那么腾讯云开发&#xff0c;是不是就是不用本地…

双指针算法的妙用:提高代码效率的秘密(2)

双指针算法的妙用&#xff1a;提高代码效率的秘密&#xff08;2&#xff09; 前言&#xff1a; 小编在前几日讲述了有关双指针算法两道题目的讲解&#xff0c;今天小编继续进行有关双指针算法习题的讲解&#xff0c;老规矩&#xff0c;今天还是两道题目的讲解&#xff0c;希望…

【Python】从入门开始抓取你想要的电影,一周可掌握基础,附完整源码

Python学习很简单&#xff0c;只是你走进了误区。 为什么你一定要先掌握枯燥的基础点后&#xff0c;再去做实际操作呢&#xff1f; 其实&#xff0c;你根本坚持不了那么长时间&#xff0c;但实际上你可以直接去做python项目。 不信&#xff1f;看看我做这个项目的思路&#x…

逐梦代码深林:Linux编译之舞,链接之诗——自举、动静态库的浪漫旅程

文章目录 问题引入&#xff0c;为什么要进行编译->汇编?一、详细解释编译器自举1. 从最初的二进制编程到汇编2. 第一代汇编编译器的诞生3. 编译器自举的出现&#xff1a;从汇编到更高级的编译器4. 自举的延续&#xff1a;从汇编到高级编程语言5. 为什么要进行编译器自举&am…

AI 写作(六):核心技术与多元应用(6/10)

一、AI 写作的核心技术概述 AI 写作在当今数字化时代正发挥着越来越重要的作用。它不仅极大地提高了写作效率&#xff0c;还为不同领域带来了创新的可能性。 AI 写作的核心技术主要包括基于模板的文本生成和基于深度学习的文本生成。基于模板的文本生成通常依赖预先设定的模板…

米家通过HomeAssistant控制笔记本电脑开关机

米家通过HomeAssistant控制笔记本电脑开关机 配置HomeAssistant配置EMQX mqtt自动化配置电脑关机实现电脑开机实现&#xff08;网络唤醒WOL包&#xff09; 环境准备&#xff1a; HomeAssistant&#xff1a;能配置接入米家的设备&#xff0c;我这里采用fnos安装MQTT服务器&…

QT信号和槽与自定义的信号和槽

QT信号和槽与自定义的信号和槽 1.概述 这篇文章介绍下QT信号和槽的入门知识&#xff0c;通过一个案例介绍如何创建信号和槽&#xff0c;并调用他们。 2.信号和槽使用 下面通过点击按钮关闭窗口的案例介绍如何使用信号和槽。 创建按钮 在widget.cpp文件中创建按钮代码如下 …

环境背景文本到语音转换

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月9日23点20分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id100000000027&uida9ecaa6323844415b87…

MySQL初学之旅(1)配置与基础操作

目录 1.前言 2.正文 2.1数据库的发展历程 2.2数据库的基础操作 2.2.1启动服务 2.2.2创建与删除数据库 2.2.3数据类型 2.2.4创建表与删除表 2.3MySQL Workbench基础使用简介 3.小结 1.前言 哈喽大家好吖&#xff0c;今天博主正式开始为大家分享数据库的学习&#xff…

【环境搭建】使用Dockerfile构建容器搭建Kylin特定版本

Kylin的有些版本官方已经下架了&#xff0c;Docker Hub上也没镜像了&#xff0c;所以需要自己搭建以下&#xff0c;为了以后更方便快捷地使用&#xff0c;就编写了一个更轻量级的Dockerfile。 准备工作 本次搭建使用的源码包来自华为云镜像站&#xff0c;里面有Kylin各个版本…

【图】图学习

0 回顾数据结构逻辑 1 图的定义和基本术语 必须有顶点&#xff0c;可以没有边。 Cn2和2*Cn2&#xff08;数学上的&#xff0c;n个顶点取2个顶点&#xff09; 概念有些多。。。。。。 2 图的定义 3 图的存储结构 无向图的邻接矩阵 有向图的邻接矩阵 网&#xff08;有权图&#…

基于RMD算法模型的信号传输统计特性的matlab模拟仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于RMD算法模型的信号传输统计特性的matlab模拟仿真。参考的文献如下&#xff1a; 即通过RMD随机中点位置模型算法&#xff0c;实现上述文献的几个仿真图。 2.…

【React】React 生命周期完全指南

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 React 生命周期完全指南一、生命周期概述二、生命周期的三个阶段2.1 挂载阶段&a…

软件工程 软考

开发大型软件系统适用螺旋模型或者RUP模型 螺旋模型强调了风险分析&#xff0c;特别适用于庞大而复杂的、高风险的管理信息系统的开发。喷泉模型是一种以用户需求为动力&#xff0c;以对象为为驱动的模型&#xff0c;主要用于描述面向对象的软件开发过程。该模型的各个阶段没有…

C++20 概念与约束(2)—— 初识概念与约束

1、概念 C20 中引入新的编译期关键字 concept 用于创建概念。个人认为将其翻译为“构思”更为贴切。直接使用时&#xff0c;它更像一个只能用于模板的布尔类型关键字。 而如果用于模板中&#xff0c;他会将模板类型先带入自身&#xff0c;当自身条件为 true 才会实例化模板&…