枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)

本文主要是介绍枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、枚举算法介绍

二、解空间的类型

三、循环枚举解空间

四、例题

(一、反倍数)

(二、特别数的和)

(三、找到最多的数)

(四、小蓝的漆房)

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


一、枚举算法介绍

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

二、解空间的类型

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

三、循环枚举解空间

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::cinint 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。

首先,我们可以枚举整个走廊需要被涂上的颜色。因为颜色的种类数最多只有 60,所以我们可以尝试枚举每一种颜色。

对于每种颜色,我们需要计算涂上它需要的最少天数。我们可以从左到右遍历每个房子,如果该房子的颜色不是当前正在涂的颜色,那么我们就从该房子开始,向右涂 k 个房子,直到将该区间都涂上目标颜色。具体来说,我们可以用另一个数组 b 来记录当前的涂漆情况,每次枚举涂漆区间时,都将 b 数组中对应的区间涂成目标颜色。

在涂漆过程中,我们需要记录涂漆的天数 cnt,每当涂漆颜色发生变化时,我们就需要增加一天。最终,我们可以对所有颜色涂上所需的天数取最小值,该最小值即为答案。

综上所述,解题步骤如下:

  1. 枚举整个走廊需要被涂上的颜色;
  2. 对于每种颜色,计算涂上它需要的最少天数:从左到右遍历每个房子,如果该房子的颜色不是当前正在涂的颜色,那么就从该房子开始,向右涂 k 个房子,直到将区间涂上目标颜色,同时记录涂漆天数 cnt,每当涂漆颜色发生变化时,增加一天;
  3. 将所有颜色涂上所需的天数取最小值,即为答案。
#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-eachint 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;
}

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

用户登录

解题思路

这道题的解题思路比较简单,具体步骤如下:

  1. 读入测试数据的数量 t,对于每组测试数据,读入物品数量 n 和物品价值 1,2,⋯,a1​,a2​,⋯,an​。

  2. 统计价值为 0 的物品个数 z,并计算物品的价值和 sum。如果序列中存在 00,则我们需要对所有的 0 进行一次操作,使得其变为 1,这样才能保证价值积不为 0。因此,我们至少需要进行 z 次操作。

  3. 对于经过操作后的序列,统计其所有元素的和 sum。如果sum≠0,则此时的序列已经满足题目要求,输出操作次数 z 即可。

  4. 如果 sum=0,则我们需要对任意一个 ai​>0,并对其进行一次操作,使得 ai​++,因为只要序列中存在正整数,我们就可以利用这些正整数来使得序列的价值积不为 00。如果序列中不存在 ai​>0,则我们需要对任意一个元素进行一次操作,使得序列中至少有一个非 0 的元素,然后再按照上述方法进行操作。因此,此时的操作次数为 z+1。

#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)//如果和为0cout << 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和printfint T = 1;std::cin >> T;for (int i = 1; i <= T; i++)solve(i);return 0;
}

今天就先到这了!!!

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

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

这篇关于枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/760292

相关文章

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

SpringMVC入参绑定特别注意

1.直接在controller中定义一个变量,但是此种传输方式有一个限制就是参数名和请求中的参数名必须保持一致,否则失效。 @RequestMapping("test2")@ResponseBodypublic DBHackResponse<UserInfoVo> test2(String id , String name){UserInfoVo userInfoVo = new UserInf

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd