2-1基础算法-枚举/模拟

news2024/11/24 16:32:07

文章目录

  • 1.枚举
  • 2.模拟

1.枚举

[例1] 特别数的和
在这里插入图片描述
评测系统

#include <iostream>
using namespace std;
bool pa(int x) {
    while (x) {
        if (x % 10 == 2 || x % 10 == 1 || x % 10 == 0 || x % 10 == 9) {
            return true;
        }
        else {
            x = x / 10;
        }
    }
    return false;
}
int main()
{
    int sum=0;
    int m;
    cin >> m;
    for (int i = 1; i <= m; i++) {
        if (pa(i)) {
            sum += i;
        }
    }
    cout << sum;
    return 0;
}

[例2] 反序数
在这里插入图片描述
评测系统

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int a, b, c;
    cin >> a >> b >> c;
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        if (i % a != 0 && i % b != 0 && i % c != 0) {
            sum++;
        }
    }
    cout << sum;
    return 0;
}

[例3] 找到最多的数
在这里插入图片描述
评测系统

#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
    int n, m;
    cin >> n >> m;
    int num = n * m;
    map<int,int> mp;
    vector<int> a(num);//记录去重后的序列
    while (num--) {
        int x;
        cin >> x;
        if (!mp.count(x)) {
            a.push_back(x);
        }
        mp[x]++;
    }
    for (const auto& x:a) { //也可以不使用vector,每次从map中取出[x.y]
        if (mp[x] * 2 > n * m)
            cout << x;
    }
}

[例4]
在这里插入图片描述
在这里插入图片描述
评测系统

对于每种可能的颜色,我们尝试计算如果将走廊涂成这种颜色需要多少天。在遍历过程中要跳过已经是这种颜色的房子,每次移动k步。最后记录对于这种颜色所需的涂色天数,并与之前的最小天数进行比较,取较小值。
输入数据的最大值即为初始颜色种类数

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while (t--) {
        int n, k;
        cin >> n >> k;
        vector<int> a(n);
        int maxnum = 0;//记录初始颜色种类数
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
            maxnum=max(maxnum, a[i]);
        }
        int ans = n;
        for (int c = 1; c <= maxnum; ++c) {
            int cnt = 0;
            int idx = 0;
            while (idx < n) {
                if (a[idx] == c) {
                    idx++;
                    continue;
                }
                idx += k;
                cnt++;
            }
            ans = min(cnt, ans);
        }
        cout << ans << endl;
    }
}

2.模拟

[例1] 扫雷
在这里插入图片描述
在这里插入图片描述
评测系统

#include <iostream>
using namespace std;
const int N = 150;
int main()
{
    int n, m;
    cin >> n >> m;
    int a[N][N], ans[N][N];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (a[i][j] == 1) { 
                ans[i][j] = 9; 
                continue; 
            }
            int i2 = i, j2 = j;//遍历四周
            for (i2 = max(0, i - 1); i2 <= min(n - 1, i + 1); i2++) {
                for (j2 = max(0, j - 1); j2 <= min(m - 1, j + 1); j2++) {
                    if (a[i2][j2] == 1) ans[i][j]++;
                }
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << ans[i][j]<<" ";
        }
        cout << endl;
    }
    return 0;
}

[例2] 灌溉
在这里插入图片描述
在这里插入图片描述
评测系统

使用类似于BFS的过程,用bool类型的irrigated数组记录当前位置是否已被灌溉,最终统计已被灌溉的数量。

#include <iostream>
#include <queue>
using namespace std;
const int N = 200;
int main()
{
    int n, m, t;
    cin >> n >> m >> t;
    bool irrigated[N][N];
    queue<pair<int, int>> q;
    for (int i = 0; i < t; i++) {
        int r, c;
        cin >> r >> c;
        r--;
        c--;
        irrigated[r][c] = true;
        q.push({ r,c });
    }
    int k;
    cin >> k;
    for (int minute = 0; minute < k; ++minute) {
        int size = q.size();
        for (int i = 0; i < size; ++i) {
            pair<int,int > fr=q.front();//取到水管的位置坐标
            int x = fr.first;
            int y = fr.second;
            q.pop();
            for (int i2 = max(0,x - 1); i2 <= min(n,x + 1); i2++) { //四周灌溉
                for (int j2 = max(0,y - 1); j2 <= min(m,y + 1); j2++) {
                    if (!irrigated[i2][j2]) {
                        irrigated[i2][j2] = true;
                        q.push({i2, j2});
                    }
                }
            }
        }
    }
    int count = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (irrigated[i][j]) {
                count++;
            }
        }
    }
    cout << count;
    return 0;
}

也可使用map

#include <iostream>
#include <map>
using namespace std;
const int N = 200;
int main()
{
    int n, m, t;
    cin >> n >> m >> t;
    bool irrigated[N][N];
    map<int, int> q;
    for (int i = 0; i < t; i++) {
        int r, c;
        cin >> r >> c;
        r--;
        c--;
        irrigated[r][c] = true;
        q[r]=c;
    }
    int k;
    cin >> k;
    for (int minute = 0; minute < k; ++minute) {
        int size = q.size();
        for (const auto& i:q) {
            int x = i.first;
            int y = i.second;
            for (int i2 = max(0,x - 1); i2 <= min(n,x + 1); i2++) {
                for (int j2 = max(0,y - 1); j2 <= min(m,y + 1); j2++) {
                    if (!irrigated[i2][j2]) {
                        irrigated[i2][j2] = true;
                        q[i2]=j2;
                    }
                }
            }
        }
    }
    int count = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (irrigated[i][j]) {
                count++;
            }
        }
    }
    cout << count;
    return 0;
}

[例3] 回文日期

在这里插入图片描述
在这里插入图片描述
评测系统

#include <iostream>
#include <string>
using namespace std;
bool huiwen(string s) {
    if (s[0] == s[7] && s[1] == s[6] && s[2] == s[5] && s[3] == s[4]) {
        return true;
    }
    else
        return false;
}
bool er(string s) {
    if (s[0] == s[2] && s[2] == s[5] && s[5] == s[7] && s[1] == s[3] && s[3] == s[4] && s[4] == s[6]) {
        return true;
    }
    else
        return false;
}
int pdday(int year, int month) {
    if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
        return 31;
    else if (month == 2) {
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
            return 29;
        }
        else
            return 28;
    }
    else
        return 30;
}
string zifuchuan(int year, int month, int day) {
    string s=to_string(year);
    if (month / 10 == 0) {
        s += '0' + to_string(month);
    }
    else {
        s += to_string(month);
    }
    if (day / 10 == 0) {
        s += '0' + to_string(day);
    }
    else {
        s += to_string(day);
    }
    return s;
}
int main()
{
    int day, month, year;
    int chushi;
    int day1,day2;
    cin >> chushi;
    day1 = chushi % 10;
    chushi = chushi / 10;
    day2= chushi % 10;
    chushi = chushi / 10;
    day=day2 * 10 + day1;

    day1 = chushi % 10;
    chushi = chushi / 10;
    day2 = chushi % 10;
    chushi = chushi / 10;
    month = day2 * 10 + day1;

    year = chushi;
    bool flag = 0;
    bool pdhuiwen = 0;
    bool pder = 0;
    int i, j, k;
    for (i = year;; i++) {
        for (j = 1; j <= 12; j++) {
            if (flag == 0) {
                j = month;
            }
            for (k = 1; k <= pdday(year,month); k++) {
                if (flag == 0) {
                    k = day+1;
                    flag = 1;
                }
                string s=zifuchuan(i, j, k);
                if (pdhuiwen!=1&&huiwen(s)) {
                    cout << s << endl;
                    pdhuiwen = 1;
                }
                if (pder!=1&&er(s)) {
                    cout << s;
                    pder = 1;
                }
                if (pdhuiwen == 1 && pder == 1) {
                    return 0;
                }
            }
        }
    }
}

[例4] 小蓝和小桥的挑战
在这里插入图片描述
评测系统

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    while (n--) {
        int m;
        cin >> m;
        vector<int> a(m);
        for(int i=0;i<m;i++){
            cin >> a[i];
        }
        int cnt = count(a.begin(), a.end(), 0); // #include <algorithm>
        int sum = 0;
        for (const auto& x : a) {
            sum += x;
        }
        if (sum == 0) {
            cout << cnt + 1;
        }
        else
            cout << cnt<<endl;
    }
}

[例5] DNA序列修正

在这里插入图片描述
在这里插入图片描述

评测系统

#include <iostream>
using namespace std;
bool pipei(char a, char b) {
    return (a == 'A' && b == 'T') || (a == 'T' && b == 'A') || (a == 'C' && b == 'G') || (a == 'G' && b == 'C');
}
int main()
{
    int n;
    cin >> n;
    string s1, s2;
    cin >> s1 >> s2;
    int cnt = 0;//计数
    for (int i = 0; i < n; ++i) {
        if (!pipei(s1[i], s2[i])) {
            cnt++;
            for (int j = i + 1; j < n; j++) {
                if (!pipei(s1[j], s2[j])
                    && pipei(s1[i], s2[j])
                    && pipei(s1[j], s2[i])
                    ) {
                    swap(s2[i], s2[j]);
                    break;
                }
            }
        }
    }
    cout << cnt;
}

[例6] 无尽的石头
在这里插入图片描述
在这里插入图片描述
评测系统

#include <iostream>
using namespace std;
int ssum(int x) {
    int sum = 0;
    while (x) {
        sum += x % 10;
        x /= 10;
    }
    return sum;
}
int main()
{
    int t;
    cin >> t;
    while (t--) {
        int x = 0;
        cin >> x;
        int step = 0;
        bool end = 0;
        for (int i = 1; i <= x; i += ssum(i)) {
            if (i == x) {
                cout << step << endl;
                end = 1;
            }
            step++;
        }
        if (end == 0) {
            cout << -1 << endl;
        }
    }
}

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

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

相关文章

设计模式——建造者模式(创建型)

引言 生成器模式是一种创建型设计模式&#xff0c; 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 问题 假设有这样一个复杂对象&#xff0c; 在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。 这些初始化代码…

育儿类App最佳广告变现方案及运营增长攻略 | TopOn变现干货

近年来&#xff0c;随着全球母婴、亲子及育儿产品的快速发展&#xff0c;移动互联网育儿App迎来了一次井喷式的发展&#xff0c;儿童数字广告支出成为了增长速度最快的细分市场。TopOn联合全球儿童安全广告平台Kidoz举办了一场线上分享会——育儿类App最佳变现解决方案及广告变…

算法——位运算

常见位运算总结 基础位运算 << >> ~与&&#xff1a;有0就是0或|&#xff1a;有1就是1异或^&#xff1a;相同为0&#xff0c;相异为1 / 无进位相加 给一个数n&#xff0c;确定他的二进制表示中的第x位是0还是1 让第x位与上1即可先让n右移x位&上一个1&#…

Docker入门安装gerrit软件

Windows上运行docker 什么是Docker Desktop docker desktop是Docker在Windows 10和macOS操作系统上的官方安装方式&#xff0c;这个方法依然属于先在 Windows 上部署 Docker 的方法都是先安装一个虚拟机&#xff0c;并在安装 Linux 系统的的虚拟机中运行 Docker。 开启Hyper-…

moogose使用

概念 Node.js 的优雅 mongodb 对象建模 Mongoose 提供了一种直接的、基于模式的解决方案来对应用程序数据进行建模。它包括开箱即用的内置类型转换、验证、查询构建、业务逻辑挂钩等 安装 npm i mongoose具体例子 E:\Nextjs\mongoose-use-demo\app\api[crud]\route.ts 连接…

数据结构:栈(Stack)的各种操作(入栈,出栈,判断栈非空,判断栈已满,附源码)

前言&#xff1a;在前面的文章中&#xff0c;我们讲解了顺序表&#xff0c;单链表&#xff0c;双向链表。而我们今天要分享的栈则是基于之前的数据结构上搭建的&#xff0c;但是相较于顺序表和链表来说&#xff0c;栈的实现就非常简单了。 目录 一.栈(Stack)的概念 二.栈的数…

TOWE 高品质220V/380V工业插头插座:插座篇

在不同工业场合和环境中&#xff0c;对工业用插头插座和耦合器的配置有着不同的要求。在实际应用中&#xff0c;我们要根据用途、工作环境、规格大小、外观造型、安装形式、功能等方面进行选择。只有确保正确选择产品&#xff0c;才能确保现实用电环境的安全、高效。 同为科技&…

什么是 web 组态?web 组态与传统组态的区别是什么?

组态软件是一种用于控制和监控各种设备的软件&#xff0c;也是指在自动控制系统监控层一级的软件平台和开发环境。这类软件实际上也是一种通过灵活的组态方式&#xff0c;为用户提供快速构建工业自动控制系统监控功能的、通用层次的软件工具。通常用于工业控制&#xff0c;自动…

数据库——字段拆分与合并

一、GP或PostgreSQL 1.字段拆分成行 unnest(string_to_array(test, ,)) 例如某一字段值为"a,b,c,d"&#xff0c;使用string_to_array将其拆分为数组&#xff0c;然后使用unnest将数组平铺成一张表 SELECT unnest(string_to_array(555,666,777, ,)) 2.字段拆分成列…

一文告诉您企业为什么这么关注数字资产指纹

数字资产指纹 在互联网数字资产管理中&#xff0c;数字资产指纹就是数字资产的“身份证”&#xff0c;也是信息系统安全管理工作的基础。通过网络资产探测&#xff08;指纹&#xff09;可以在0day&#xff08;通常是指还没有补丁的漏洞&#xff09; 爆发时快速匹配到受影响的信…

B029-JDBC增强

目录 PreparedStatement 查询1.sql注入2.Statement分析 (面试题)3.PreparedStatement (面试题) 登录功能的完善事务链接池概念实现DBCP连接池实现第一种配置方式第二种配置方式 返回主键BaseDao的抽取 PreparedStatement 查询 1.sql注入 就是在sql的字符串拼接的时候&#xf…

ChibiOS简介3/5

ChibiOS简介3/5 1. 源由2. ChibiOS基础知识3/52.7 Chapter 7 - RT Time and Intervals2.7.1 Basic concepts2.7.2 APIs 2.8 Chapter 8 - RT Virtual Timers2.8.1 Basic concepts2.8.2 Tickless Mode2.8.3 APIs 2.9 Chapter 9 - RT Scheduler2.9.1 Basic concepts2.9.2 System C…

两线制无源 4-20mA 回路供电隔离变送器

两线制无源 4-20mA 回路供电隔离变送器 一入一出两线制无源 4-20mA 回路供电隔离变送器 概述&#xff1a;JSD TAW-1001D-100L-F 系列隔离变送器是 4-20mA 两线制回路供电的电流隔离变送配电器,该隔离变送器采用电磁隔离技术,并通过输入端馈电方式,给输入端两线制仪器仪表设备供…

数据库 02-03补充 聚合函数--一般聚合分组和having

聚合函数&#xff1a; 01.一般的聚合函数&#xff1a; 举个例子&#xff1a; 一般聚合函数是用于单个元祖&#xff0c;就是返回一个数值。 02.分组聚合&#xff1a;可以返回多个元祖 举个例子&#xff1a; 分组的注意&#xff1a; 主要的是根据分组的话&#xff0c;一个…

【git push ERROR: commit id: missing Change-Id in message footer】

使用 gerrit 后&#xff0c;提交代码会出现如下截图问题&#xff1a; 临时解决&#xff1a; step1: 把上面红色的那条gitidir复制下来执行下&#xff1a; step2:执行下面的命令会添加change_id git commit --amendstep3: 然后推送代码到服务器上 git push origin HEAD:refs/fo…

万界星空科技电子装配行业MES解决方案

电子电器装配属于劳动密集型、科技含量较高的行业&#xff0c;产品零部件种类繁多&#xff0c;生产组装困难&#xff0c;生产过程存在盲点&#xff0c;同时也决定了生产流水线多且对自动化水平要求较高。 万界星空科技提供的电子行业MES解决方案&#xff0c;提供从仓储管理、生…

排序算法:【选择排序]

一、选择排序——时间复杂度 定义&#xff1a;第一趟排序&#xff0c;从整个序列中找到最小的数&#xff0c;把它放到序列的第一个位置上&#xff0c;第二趟排序&#xff0c;再从无序区找到最小的数&#xff0c;把它放到序列的第二个位置上&#xff0c;以此类推。 也就是说&am…

STM32 CAN多节点组网项目实操 挖坑与填坑记录

摘要 CAN线性组网项目开发过程中遇到的数据丢包问题&#xff0c;并尝试解决的记录和推测分析。 关键词 CAN串联多节点通讯、CAN10节点通讯、CAN数据丢包、STM32 CAN 背景/项目介绍 概述&#xff1a; 开发了一个多节点线性组网采集数据的项目。 系统包含1个供电和数据网关板还有…

如何利用Guava优化Java网络编程

第1章&#xff1a;引言 大家好&#xff01;今天小黑要和咱们聊聊一个很酷的话题&#xff1a;如何利用Google的Guava库来优化Java网络编程。网络编程&#xff0c;这玩意儿听起来就高大上&#xff0c;不是吗&#xff1f;但实际上&#xff0c;它充满了各种挑战。从处理复杂的数据…

【二分查找】【滑动窗口】LeeCode2528:最大化城市的最小电量

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 滑动窗口 题目 给你一个下标从 0 开始长度为 n 的整数数组 stations &#xff0c;其中 stations[i] 表示第 i 座城市的供电站数目。 每个供电站可以在一定 范围 内给所有城…