基础算法——模拟

模拟,顾名思义,就是题⽬让你做什么你就做什么,考察的是将思路转化成代码的代码能⼒。 这类题⼀般较为简单,属于竞赛⾥⾯的签到题(但是,万事⽆绝对,也有可能会出现让⼈⾮常难受的 模拟题),我们在学习语法阶段接触的题,⼤多数都属于模拟题。

一、 多项式输出

题⽬来源:洛⾕

题⽬链接:P1067 [NOIP 2009 普及组] 多项式输出 - 洛谷

难度系数:★

1. 题目描述

2. 算法原理

解法:模拟+分类讨论,对于⼀元 次⽅程的的最终结果,我们仅需按照顺序,考虑每⼀项的三件事情:一项一项输出,每一项关心三个部分:符号+数+次数

处理「符号」:

  • 如果系数⼩于 ,直接输出"-";
  • 如果系数⼤于 ,除了⾸项不输出"+",其余全部输出"+"。 

处理「系数」: 

  • 先取⼀个绝对值,因为正负的问题已经处理过了;
  • 当系数不等于 1,直接输出这个数;
  • 但是当系数为 1,且是最后⼀项的时候,这个1 也是需要输出的;其余情况下的 1不需要输 出。 

处理「次数」: 

  • 次数⼤于 1,输出"x^"+对应的次数; 
  • 次数等于 1,输出"x"; 
  • 次数⼩于 1,什么也不输出。 

3. 参考代码

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int n; cin >> n;

    // 循环次数
    for (int i = n; i >= 0; i--)
    {
        int a; cin >> a;
        if (a == 0) continue; // 处理系数为 0 的情况

        // 1. 符号
        if (a < 0) cout << '-';
        else
        {
            if (i != n) cout << '+';
        }

        // 2. 数字
        a = abs(a);
        if (a != 1 || (a == 1 && i == 0)) cout << a;

        // 3. 次数
        if (i == 0) continue;
        else if (i == 1) cout << 'x';
        else cout << "x^" << i;

    }

    return 0;
}

二、蛇形⽅阵

题⽬来源:洛⾕

题⽬链接:P5731 【深基5.习6】蛇形方阵 - 洛谷

难度系数:★

1. 题目描述

2. 算法原理

模拟填数的过程。

在⼀个矩阵中按照⼀定规律填数的通⽤解法:

  • 定义⽅向向量,⽐如本题⼀共四个⽅向,分别是右、下、左、上,对应: (0, 1) 、 (1,0) 、 (0,−1) 、 (−1,0) 

  • 循环填数的规则:

  • 朝⼀个⽅向⾛,⼀边⾛⼀边填数,直到越界;
a < 1 || a > n || b < 1 || b > n || arr[a][b] != 0
  • 越界之后,结合定义的⽅向向量求出下⼀轮应该⾛的⽅向以及应该到达的正确位置;
pos = (pos + 1) % 4;
a = x + dx[pos], b = y + dy[pos];
  • 重复上述过程,直到把所有的数填完为⽌。

3. 参考代码

#include <iostream>

using namespace std;

const int N = 15;

// 定义 右,下,左,上 四个方向
int dx[] = { 0, 1, 0, -1 };
int dy[] = { 1, 0, -1, 0 };

int arr[N][N];

int main()
{
    int n; cin >> n;

    // 模拟填数过程
    int x = 1, y = 1; // 初始位置
    int cnt = 1; // 当前位置要填的数
    int pos = 0; // 当前的方向

    while (cnt <= n * n)
    {
        arr[x][y] = cnt;

        // 计算下一个位置
        int a = x + dx[pos], b = y + dy[pos];

        // 判断是否越界
        if (a < 1 || a > n || b < 1 || b > n || arr[a][b])
        {
            // 更新出正确的该走的位置
            pos = (pos + 1) % 4;
            a = x + dx[pos], b = y + dy[pos];
        }

        x = a, y = b;
        cnt++;
    }

    // 输出
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            printf("%3d", arr[i][j]);
        }
        puts("");
    }


    return 0;
}

三、字符串的展开

题⽬来源:洛⾕

题⽬链接:P1098[NOIP2007提⾼组]字符串的展开

难度系数:★

1. 题目描述

2. 算法原理

根据规则模拟字符串展开的过程即可。

题⽬的规则较⻓,但是叙述的⾮常详细,只要把「细节」考虑到位,「分类讨论」就能搞定。

3. 参考代码

#include <iostream>
#include <algorithm>

using namespace std;

int p1, p2, p3, n;
string s;
string ret;

// 判断是否是数字字符
bool isdig(char ch)
{
    return ch >= '0' && ch <= '9';
}

// 判断是否是小写字母
bool islet(char ch)
{
    return ch >= 'a' && ch <= 'z';
}

// 把 [left, right] 之间的字符展开
// left, right 这两个字符是不做处理
void add(char left, char right)
{
    string t;

    // 遍历中间的字符
    for(char ch = left + 1; ch < right; ch++)
    {
        char tmp = ch;
        // 处理 p1
        if(p1 == 2 && islet(tmp)) tmp -= 32; // 小写变大写
        else if(p1 == 3) tmp = '*'; // 变成星号

        // 处理 p2
        for(int i = 0; i < p2; i++)
        {
            t += tmp;
        }
    }

    // 处理 p3
    if(p3 == 2) reverse(t.begin(), t.end());

    ret += t;
}

int main()
{
    cin >> p1 >> p2 >> p3 >> s;
    n = s.size();

    for(int i = 0; i < n; i++)
    {
        char ch = s[i];

        if(s[i] != '-' || i == 0 || i == n - 1) ret += ch;
        else
        {
            char left = s[i - 1], right = s[i + 1];
            // 判断是否展开
            if(isdig(left) && isdig(right) && right > left ||
               islet(left) && islet(right) && right > left)
            {
                // 展开
                add(left, right);
            }
            else 
            {
                ret += ch;
            }
        }
    }

    cout << ret << endl;

    return 0;
}

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

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

相关文章

SparkStreaming之04:调优

SparkStreaming调优 一 、要点 4.1 SparkStreaming运行原理 深入理解 4.2 调优策略 4.2.1 调整BlockReceiver的数量 案例演示&#xff1a; object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…

Jenkins 删除历史构建记录

中文:系统管理 > 脚本命令行: 英文:Manage Jenkins > Script Console def jobName "Wens-Web" //删除的项目名称 def maxNumber 105 // 保留的最小编号&#xff0c;意味着小于该编号的构建都将被删除 Jenkins.instance.getItemByFullName(jobName).build…

全国青少年航天创新大赛各项目对比分析

全国青少年航天创新大赛各项目对比分析 一、比赛场地对比 项目名称场地尺寸场地特点组别差异筑梦天宫虚拟三维场景动态布局&#xff0c;小学组3停泊处&#xff0c;初高中组6停泊处&#xff1b;涉及传送带、机械臂、传感器等虚拟设备。初中/高中组任务复杂度更高&#xff0c;运…

探秘 Linux 系统编程:进程地址空间的奇妙世界

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 在 Linux 系统编程的领域里&#xff0c;进程地址空间可是个相当重要的…

vue videojs使用canvas截取视频画面

前言 刚开始做的时候太多坑&#xff0c;导致一直报错&#xff1a; Uncaught (in promise) TypeError: Failed to execute ‘drawImage’ on ‘CanvasRenderingContext2D’: The provided value is not of type ‘(CSSImageValue or HTMLCanvasElement or HTMLImageElement or H…

防火墙旁挂组网双机热备负载均衡

一&#xff0c;二层交换网络&#xff1a; 使用MSTPVRRP组网形式 VLAN 2--->SW3为主,SW4 作为备份 VLAN 3--->SW4为主,SW3 作为备份 MSTP 设计 --->SW3 、 4 、 5 运行 实例 1 &#xff1a; VLAN 2 实例 2 &#xff1a; VLAN 3 SW3 是实例 1 的主根&#xff0c;实…

记忆化搜索与动态规划:原理、实现与比较

记忆化搜索和动态规划是解决优化问题的两种重要方法&#xff0c;尤其在处理具有重叠子问题和最优子结构性质的问题时非常有效。 目录 1. 记忆化搜索&#xff08;Memoization&#xff09; 定义&#xff1a; 实现步骤&#xff1a; 示例代码&#xff08;斐波那契数列&#xff0…

《几何原本》命题I.9

《几何原本》命题I.9 一个角可以切分成两个相等的角。 设 ∠ E A F \angle EAF ∠EAF 为给定角 在 A E , A F AE,AF AE,AF 上任取两点 B , C B,C B,C 使得 A B A C ABAC ABAC 连结 B C BC BC 在 A A A 下方作等边三角形 B C D BCD BCD 则 A B A C , B D C D , A D…

docker-compose安装anythingLLM

1、anythingLLM的docker-compose文件 version: 3.8 services:anythingllm:image: mintplexlabs/anythingllm:latestcontainer_name: anythingllmports:- "23001:3001"cap_add:- SYS_ADMINenvironment:# Adjust for your environment- STORAGE_DIR/app/server/storage…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序📚前言📚页面效果📚指令…

SQL命令详解之多表查询(连接查询)

目录 1 简介 2 内连接查询 2.1 内连接语法 2.2 内连接练习 3 外连接查询 3.1 外连接语法 3.2 外连接练习 4 总结 1 简介 连接的本质就是把各个表中的记录都取出来依次匹配的组合加入结果集并返回给用户。我们把 t1 和 t2 两个表连接起来的过程如下图所示&#xff1a; …

二、QT和驱动模块实现智能家居-----问题汇总1

1、文件地址改变后必须在QT下更改地址 2、指定了QT内Kits下的Sysroot头文件地址&#xff0c;但是还是找不到头文件&#xff1a; 3、提示无法执行QT程序&#xff1a;先干掉之前的QT程序 ps //查看程序PIDkill -9 PID 4、无法执行QT程序 1&#xff09;未设置环境变量 …

CentOS7安装Mysql5.7(ARM64架构)

1.第一步&#xff1a;下载 arm 版本离线 mysql 5.7 安装包 arm 版本离线 mysql 5.7 安装包 2.第二步&#xff1a;查询并卸载 CentOS 自带的数据库 Mariadb 找到数据库 mariadb&#xff0c;如果有会给出一个结果&#xff0c;结果是 mariadb 名称 rpm -qa | grep mariadb 如果…

AI数字人口播源码开发全解析

——源码即未来&#xff1a;揭秘千亿级市场的技术底层逻辑 一、为什么源码开发是数字人赛道的“核武器”&#xff1f; 2025年全球AI数字人市场规模预计突破6402.7亿元&#xff0c;而源码开发能力正成为企业竞争的核心壁垒。与标准化SaaS工具相比&#xff0c;源码开发赋予三大…

Versal - XRT(CPP) 2024.1

目录 1.简介 2. XRT 2.1 XRT vs OpenCL 2.2 Takeways 2.3 XRT C APIs 2.4 Device and XCLBIN 2.5 Buffers 2.5.1 Buffer 创建 2.5.1.1 普通 Buffer 2.5.1.2 特殊 Buffer 2.5.1.3 用户指针 Buffer 2.5.2 Data Transfer 2.5.2.1 read/write API 2.5.2.2 map API 2…

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks KDD22 推荐指数&#xff1a;#paper/⭐⭐#​ 动机 本文探讨了图神经网络&#xff08;GNN&#xff09;在迁移学习中“预训练-微调”框架的局限性及改进方向。现有方法通过预训练&#xff08…

微信小程序上如何使用图形验证码

1、php服务器生成图片验证码的代码片段如下&#xff1a; 注意红框部分的代码&#xff0c;生成的是ArrayBuffer类型的二进制图片 2、显示验证码 显示验证码&#xff0c;不要直接image组件加上src显示&#xff0c;那样拿不到cookie&#xff0c;没有办法做图形验证码的验证&…

MAX232数据手册:搭建电平转换桥梁,助力串口稳定通信

在现代电子设备的通信领域&#xff0c;串口通信因其简单可靠而被广泛应用。MAX232 芯片作为串口通信中的关键角色&#xff0c;发挥着不可或缺的作用。下面&#xff0c;我们将依据提供的资料&#xff0c;深入解读 MAX232 芯片的各项特性、参数以及应用要点。 一、引脚说明 MAX2…

HTTP 与 HTTPS 协议:从基础到安全强化

引言 互联网的消息是如何传递的&#xff1f; 是在路由器上不断进行跳转 IP的目的是在寻址 HTTP 协议&#xff1a;互联网的基石 定义 HTTP&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;&#xff0c;即超文本传输协…

记录linux安装mysql后链接不上的解决方法

首先确保是否安装成功 systemctl status mysql 如果没有安装的话&#xff0c;执行命令安装 sudo apt install mysql-server 安装完成后&#xff0c;执行第一步检测是否成功。 通常初始是没有密码的&#xff0c;直接登陆 sudo mysql -u root 登录后执行以下命令修改密码&…