枚举(蓝桥练习)

news2025/2/25 9:08:28

目录

一、枚举算法介绍

二、解空间的类型

三、循环枚举解空间

四、例题

(一、反倍数)

(二、特别数的和)

(三、找到最多的数)

(四、小蓝的漆房)

(五、小蓝和小桥的挑战)


一、枚举算法介绍

枚举算法是一种基本的算法思想,它通过穷举所有可能的情况来解决问题。它的基本思想是将问题的解空间中的每个可能的解都枚举出来,并进行验证和比较,找到满足问题条件的最优解或者所有解。
枚举算法适用于问题规模较小、解空间可穷举的情况。它的优点是简单直观,不需要复杂的数学推导,易于实现。但是,由于需要穷举所有可能的情况,对于问题规模较大的情况,枚举算法的时间复杂度可能会非常高,效率较低。

二、解空间的类型

解空间可以是一个范围内的所有数字(或二元组、字符串等数据),或者满足某个条件的所有数字
当然也可以是解空间树,一般可分为子集树和排列树,针对解空间树,需要使用回溯法进行枚举(在后面讲到搜索的时候会讲到)。
我们目前仅使用循环去暴力枚举解空间,具体的解空间类型需要根据题目来理解构造。

三、循环枚举解空间

1.首先确定解空间的维度,即问题中需要枚举的变量个数。例如当题目要求的是满足条件的数字时,我们可以循环枚举某个范围内的数字。如果要求的是满足条件的二元组,我们可以用双重循环分别枚举第一个和第二个变量,从而构造出一个二元组。
2.对于每个变量,确定其可能的取值范围。这些范围可以根据问题的性质和约束条件来确定。
这一步往往是时间复杂度优化的关键。
3.在循环体内,针对每个可能解进行处理。可以进行问题的验证、计算、输出等操作

四、例题

(一、反倍数)

用户登录

题目描述
给定三个整数 a,b,c,如果一个整数既不是 a的整数倍也不是b的整数倍还不是 c的整数倍,则这个数称为反倍数。
请问在 1至 n 中有多少个反倍数。
输入描述
输入的第一行包含一个整数 n。
第二行包含三个整数 a,b,c,相邻两个数之间用一个空格分隔。其中,1≤n<1000000,1≤a≤n,1≤b≤n,1≤c≤n
输出描述
输出一行包含一个整数,表示答案。

#define  _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std; // 使用std命名空间,以便直接使用cout、cin等,而不是std::cout、std::cin

int a, b, c;

bool f(int x)
{
    return x % a != 0 && x % b != 0 && x % c != 0;
}

int main()
{
    int n; cin >> n;
    cin >> a >> b >> c;
    int ans = 0;
    for (int i = 1; i <= n; ++i)
    {
        if (f(i))ans ++;
    }
    cout << ans << '\n';
    return 0;
}

(二、特别数的和)

用户登录

题目描述
小明对数位中含有 2、0、1、9的数字很感兴趣(不包括前导 0),在1到40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是574。
请问,在1到n中,所有这样的数的和是多少?
输入描述
输入格式:
输入一行包含两个整数 n(1≤n≤ 104)
输出描述
输出一行,包含一个整数,表示满足条件的数的和。

#include <bits/stdc++.h>
using namespace std;

bool f(int x)
{
    while (x)
    {
        int y = x % 10; //个位数
        if (y == 2 || y == 0 || y == 1 || y == 9)return true;
        x /= 10; //缩小十倍,向下取整
    }
    return false;
}

int main()
{
    int n; cin >> n;
    int ans = 0;
    for (int i = 1; i <= n; ++i)
    {
        if (f(i))ans += i;
    }
    cout << ans << '\n';
    return 0;
}

(三、找到最多的数)

题目描述
小明对数位中含有 2、0、1、9的数字很感兴趣(不包括前导 0),在1到40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是574。
请问,在1到n 中,所有这样的数的和是多少?
输入描述
输入格式:
输入一行包含两个整数n(1≤n≤ 104)

用户登录

#include <bits/stdc++.h>
using namespace std;

bool f(int x)
{
    while (x)
    {
        int y = x % 10;
        if (y == 2 || y == 0 || y == 1 || y == 9)return true;
        x /= 10;
    }
    return false;
}

int main()
{
    int n; cin >> n;
    int ans = 0;
    for (int i = 1; i <= n; ++i)
    {
        if (f(i))ans += i;
    }
    cout << ans << '\n';
    return 0;
}

(四、小蓝的漆房)

用户登录

问题描述
小蓝是一位有名的漆匠,他的朋友小桥有一个漆房,里面有一条长长的走廊,走廊两旁有许多相邻的房子,每间房子最初被涂上了一种颜色。
小桥来找小蓝,想让他把整个走廊都涂成同一个颜色。小蓝告诉小桥,他每天只能涂一段长度为ん的区间。对于每个区间,他可以选择将其中的房子重新涂上任何一种颜色,或者保持原来的颜色不变
小桥想知道小蓝至少要涂几天,才能让整个走廊变得美丽。
请帮助小桥解决这个问题。
输入格式
第一行包含一个整数t(1< 100),表示测试用例的数量.
每个测试用例的第一行包含两个整数 n 和 k(1 ≤ k≤n< 104),第二行包含几 个整数 a1,a2,···,an(1 < ai< 60),分别表示每个房子最初的颜色。
保证所有测试用例中 n 的总和不超过 10000。

#include <bits/stdc++.h>

void solve(const int &Case) {
    int n, k;
    std::cin >> n >> k;
    std::vector<int> a(n);
    for (auto &x: a)std::cin >> x; //range-for-each
    int ans = n + 1; // 初始化答案ans为一个大于n的值,以便后续取最小值  
    for (int c = 1; c <= 60; c++) {//枚举最终颜色
        int ret = 0;//存放当前最终颜色
        for (int i = 0; i < n; i++) {
            if (a[i] != c) { // 如果出现一个与最终颜色不同的位置, 则贪心地选择该位置为染色的起点
                //i,i + 1,i + 2,...,i +k - 1 都会被立刻染成最终颜色
                ret++;
                i = i + k - 1;
            }
        }
        ans = std::min(ans, ret);
    }
    std::cout << ans << '\n';
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int T = 1;
    std::cin >> T;
    for (int i = 1; i <= T; i++)solve(i);
    return 0;
}

(五、小蓝和小桥的挑战)

用户登录

#define  _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int a[N], t, n;
int main()
{
	cin >> t;
	while (t--)
	{
		cin >> n;
		int sum = 0, z = 0;
		for (int i = 1; i <= n; ++i)
		{
			cin >> a[i],sum += a[i];
			if (!a[i])++z;//如果a[i] == 0,执行一次操作
		}
		sum += z;//输入的数 + 执行加一后的次数
		if (sum == 0)//如果和为0
		cout << z + 1 << '\n';
		else cout << z << '\n';
	}
	return 0;
}

 乘积和加法的和都不为0
 如果只考虑乘积不为0
 如果乘积为0,则说明存在零(zero)元素
 此时的答案一定是所有零(zero)元素都加一
 如果只考虑加法为0, 那么随便选择一个数加一
 回到原问题, 同时考虑乘法和加法
 1.乘积为0, 且加法也为0
 此时将所有零(zero)元素加一即可
 2.乘积为0, 加法不为0
 2.1.乘积为0, 加法不等于零(zero)元素的个数的相反数
 此时将所有零(zero)元素加一即可
 2.2.乘积为0, 加法等于零(zero)元素的个数的相反数
 此时将所有0元素加一后, 再选择一个数加一
 3.乘积不为0,加法为0
 此时将某个正数加一即可
 4.乘积不为0,加法也不为0
 不动

#include <bits/stdc++.h>
void solve(const int &case)
{
  int n;
  std::cin >> n;
  int zeroCount = 0, sum = 0; // zeroCount 记录0的个数,sum 记录所有整数的和  
    for (int i = 0; i < n; i++) {  
        int x;  
        std::cin >> x; // 输入一个整数  
        if (x == 0) zeroCount++; // 如果输入的整数是0,zeroCount自增  
        sum += x; // 将输入的整数累加到sum上  
    }  
    // 如果存在0,则至少需要zeroCount次操作将0变为非0数(每次操作可以将一个0变成任意非0数)  
    // 如果不存在0,但所有数的和为0,则至少需要1次操作(将所有数同时加上一个非0数)  
    // 如果既不存在0,所有数的和也不为0,则不需要操作  
    if (zeroCount > 0) {  
        std::cout << zeroCount << '\n'; // 输出将0变成非0数的最少操作次数  
    } else if (sum == 0) {  
        std::cout << 1 << '\n'; // 输出将所有数和变成非0数的最少操作次数(1次)  
    } else {  
        std::cout << 0 << '\n'; // 不需要操作,直接输出0  
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);// 取消读入输出的同步流, 取消后不能使用 scanf和printf
    int T = 1;
    std::cin >> T;
    for (int i = 1; i <= T; i++)solve(i);
    return 0;
}

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

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

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

相关文章

Visual Studio:指针和固定大小缓冲区只能在不安全的上下文中使用、 设置允许使用不安全代码(unsafe)

问题描述: 指针和固定大小缓冲区只能在不安全的上下文中使用 解决方案&#xff1a; 1、解决方案资源管理器-》选择项目-》右键-》属性 2、在生成窗口中&#xff0c;勾选“允许不安全代码” 3、再次“生成解决方案”即可

THINKPHP 跨域报错解决方案

报错&#xff1a;has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the requested resource. 环境&#xff1a;thinkphp6 nginx 今天和VUE配合调用接口的时候发现跨…

【MySQL】MySQL数据管理——DDL数据操作语言(数据表)

目录 创建数据表语法列类型字段属性SQL示例创建学生表 查看表和查看表的定义表类型设置表的类型 面试题&#xff1a;MyISAM和InnoDB的区别设置表的字符集删除表语法示例 修改表修改表名语法示例 添加字段语法示例 修改字段语法示例 删除字段语法示例 数据完整性实体完整性域完整…

Window系统部署Z-blog并结合内网穿透实现远程访问本地博客站点

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于光流法以及背景减除法的降雪检测项目知识点总结

项目总结目录 一、算法部分1.光流法部分知识点2.python代码与大华摄像头之间的实时调用3.两个方法的代码 一、算法部分 1.光流法部分知识点 像素坐标系与直角坐标系之间的转换&#xff0c;之后计算角度。 其中光流法通过判断运动目标的角度来识别是否为降雪&#xff0c;通过…

VS2019 - 未启用调试

在昨天的工作中&#xff0c;遇到了下面的报错&#xff0c;提示的我感觉很莫名其妙&#xff0c;最后找到了解法&#xff0c;记录一下。 弹窗提示 原因 修改了Web.config文件&#xff0c;并且没有保存&#xff0c;也没关闭已经打开的Web.config文件。 解决方案 保存并没关闭已…

部分卷积与FasterNet模型详解

简介 论文原址&#xff1a;2023CVPR&#xff1a;https://arxiv.org/pdf/2303.03667.pdf 代码仓库&#xff1a;GitHub - JierunChen/FasterNet: [CVPR 2023] Code for PConv and FasterNet 为了设计快速神经网络&#xff0c;很多工作都集中于减少浮点运算&#xff08;FLOPs&a…

(libusb) usb口自动刷新

文章目录 libusb自动刷新程序Code目录结构Code项目文件usb包code包 效果描述重置reset热拔插使用 END libusb 在操作USB相关内容时&#xff0c;有一个比较著名的库就是libusb。 官方网址&#xff1a;libusb 下载&#xff1a; 下载源码官方编好的库github&#xff1a;Release…

Mysql REGEXP正则运算符

# 邮箱h开头 mysql> select email form xxx where email REGEXP ^h;

就业班 2401--2.28 Linux Day7--存储管理1

一 .存储管理 主要知识点: 基本分区、逻辑卷LVM、EXT3/4/XFS文件系统、RAID 初识硬盘 机械 HDD 固态 SSD SSD的优势 SSD采用电子存储介质进行数据存储和读取的一种技术&#xff0c;拥有极高的存储性能&#xff0c;被认为是存储技术发展的未来新星。 与传统硬盘相比&#…

单点登录的三种方式

前言 在B/S系统中&#xff0c;登录功能通常都是基于Cookie 来实现的。当用户登录成功后&#xff0c;一般会将登录状态记录到Session中&#xff0c;或者是给用户签发一个 Token&#xff0c;无论哪一种方式&#xff0c;都需要在客户端保存一些信息(Session ID或Token)&#xff0…

服务器数据恢复-异常断电导致服务器硬盘离线的数据恢复案例

服务器数据恢复环境&#xff1a; dell某型号服务器中有一组通过raid卡组建的raid10&#xff0c;该raid阵列中一共有4块磁盘。上层部署XenServer虚拟化平台&#xff0c;作为网站服务器使用。 服务器故障&#xff1a; 服务器异常断电导致服务器上的一台虚拟机不可用。需要恢复这…

优维全面可观测产品能力分解④:故障可观测

《优维全面可观测产品能力分解》系列文章的第一篇&#xff0c;介绍了「架构可观测」是从系统架构的视角来呈现链路与服务的状态数据&#xff1b;第二篇介绍了「变更可观测」是从变更的角度看系统状态的变化&#xff0c;及与事件的关联关系&#xff1b;第三篇介绍了「应用服务可…

配置资源管理Secret

目录 一、什么是Secret? 二、secret的三种类型 三、pod适用secret的三种方式 四、secret实例 1、创建secret 2、使用Secret方式 一、什么是Secret? Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源&#xff0c;目的是为了更方便的控制使用数据&#xff0c;并…

MWC 2024丨移远通信全新Wi-Fi 7和蓝牙5.4模组组合,为PC提供巅峰无线连接体验

2月26日&#xff0c;在MWC 2024展会期间&#xff0c;全球领先的物联网整体解决方案供应商移远通信对外宣布&#xff0c;其已正式推出新型Wi-Fi 7和蓝牙5.4二合一模组NCM8x5系列。该系列产品专为个人电脑&#xff08;PC&#xff09;无线连接场景设计&#xff0c;具有低延时、超高…

python 中常用的热门库介绍

阅读本文之前请参阅-----如何系统的自学python Python 是一种非常流行的编程语言&#xff0c;它的一个主要优势是拥有一个庞大的生态系统&#xff0c;其中包括许多强大的库。这些库为各种任务提供了解决方案&#xff0c;从数据分析到机器学习&#xff0c;从网络爬虫到图像处理。…

【ArcPy】验证是否存在

实例展示 代码 import arcpy def script_tool(param0, param1,param2):if arcpy.Exists(param0):arcpy.AddMessage("图层存在");if arcpy.Exists(param0):arcpy.AddMessage("工作空间存在");if arcpy.Exists(param0):arcpy.AddMessage("要素存在&quo…

蓝桥杯-灌溉

参考了大佬的解题思路&#xff0c;先遍历一次花园&#xff0c;找到所有的水源坐标&#xff0c;把它们存入 “水源坐标清单” 数组内&#xff0c;再读取数组里的水源坐标进行扩散。 #include <iostream> using namespace std; int main() {int n,m,t,r,c,k,ans0,list_i0;…

编写科技项目验收测试报告需要注意什么?第三方验收测试多少钱?

科技项目验收测试是一个非常重要的环节&#xff0c;它对于确保科技项目的质量和可用性起着至关重要的作用。在项目完成后&#xff0c;进行科技项目验收测试可以评估项目的功能、性能和可靠性等方面&#xff0c;并生成科技项目验收测试报告&#xff0c;以提供给项目的相关方参考…

C语言数据结构基础-单链表

1.链表概念 在前面的学习中&#xff0c;我们知道了线性表&#xff0c;其中逻辑结构与物理结构都连续的叫顺序表&#xff0c;那么&#xff1a; 链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 2.链表组…