当前位置: 首页 > news >正文

NO.56|基础算法-模拟|多项式输出|蛇形方阵|字符串的展开|方向向量(C++)

模拟

模拟,顾名思义,就是题⽬让你做什么你就做什么,考察的是将思路转化成代码的代码能⼒

P1067 [NOIP 2009 普及组] 多项式输出 - 洛谷

模拟+分类讨论,对于⼀元n次⽅程的的最终结果,我们仅需按照顺序,考虑每⼀项的三件事情:符号+系数+次数。

  • 处理「符号」:
    • 如果系数⼩于0 ,直接输出"-";
    • 如果系数⼤于0 ,除了⾸项不输出"+“,其余全部输出”+"
  • 处理「系数」:
    • 先取⼀个绝对值,因为正负的问题已经处理过了;
    • 当系数不等于1 ,直接输出这个数;
    • 但是当系数为1 ,且是最后⼀项的时候,这个1也是需要输出的;其余情况下的1不需要输出。
  • 处理「次数」:
    • 次数⼤于1 ,输出"x^"+对应的次数;
    • 次数等于1 ,输出"x";
    • 次数⼩于1 ,什么也不输出。
#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n; cin >> n;
    for (int i = n; i >= 0; i--)
    {
        int a; cin >> a;
        if (a == 0) continue;
        if (a < 0) cout << '-';
        else
        {
            if (i != n) cout << '+';
        }

        a = abs(a);
        if (a != 1 || (a == 1 && i == 0)) cout << a;

        if (i == 0) continue;
        else if (i == 1) cout << 'x';
        else cout << "x^" << i;
    }
        
    return 0;
}
P5731 【深基5.习6】蛇形方阵 - 洛谷

在这里插入图片描述

模拟填数的过程。
在⼀个矩阵中按照⼀定规律填数的通⽤解法:

  • 定义⽅向向量,⽐如本题⼀共四个⽅向,分别是右、下、左、上,对应:(0, 1)、(1, 0)、(0, -1)、(-1, 0)
  • 循环填数的规则:
    • 朝⼀个⽅向⾛,⼀边⾛⼀边填数,直到越界;
    • 越界之后,结合定义的⽅向向量,求出下⼀轮应该⾛的⽅向以及应该到达的正确位置;
    • 重复上述过程,直到把所有的数填完为⽌。
#include <bits/stdc++.h>
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()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    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 [NOIP 2007 提高组] 字符串的展开 - 洛谷
#include <bits/stdc++.h>
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之间的字符展开
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()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    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;
}

相关文章:

  • 《汽车理论》第一章作业1.3
  • 如何学好linux驱动
  • 【机器学习】什么是线性回归?
  • 3.24-1接口测试理论
  • C++输入输出流第二弹:文件输入输出流and字符串输入输出流
  • Simula语言的正则表达式
  • 提升生产效率的关键: ethercat转TCPIP网关智能通信
  • 详细Linux中级知识(不断完善)
  • FreeSWITCH入门到精通系列(四):FreeSWITCH模块介绍与使用
  • C . Serval and The Formula【Codeforces Round 1011 (Div. 2)】
  • 社群经济4.0时代:开源链动模式与AI技术驱动的电商生态重构
  • DockerFile制作镜像(Dockerfile Creates an Image)
  • 在Spring Boot中,可以通过实现一些特定的接口来拓展Starter
  • 心法利器[132] | 大模型系统性能优化trick
  • 5.2 位运算专题:LeetCode 268. 丢失的数字
  • Ubuntu 系统部署 Ollama + DeepSeek + Docker + Ragflow
  • 企业微信实现“关联外部选项“、“审批控件中的外部选项“
  • Four.meme是什么,一篇文章读懂
  • 信息的度量
  • 安宝特方案丨安宝特AR远程医疗方案如何重塑智慧医疗服务体系?
  • TCL科技一季度净利增超三倍,去年半导体显示业务营收创新高
  • 王毅:妥协退缩只会让霸凌者得寸进尺
  • 人民日报评论员:汇聚起工人阶级和广大劳动群众的磅礴力量
  • 当隐身13年的北小京决定公开身份 ,专业戏剧评论依然稀缺
  • 格力电器去年净利增长一成:消费电器营收下滑4%,一季度净利增长26%
  • 合肥一季度GDP为3003.88亿元,同比增长6.6%