C++基础算法之枚举

星光不问赶路人

岁月不负有心人


🎥烟雨长虹,孤鹜齐飞的个人主页

🔥个人专栏

期待小伙伴们的支持与关注!!!


目录

枚举算法的简介 

枚举算法的运用

#特别数的和

题目描述#

输入描述#

输入输出样例#

 #找到最多的数

问题描述#

输入格式#

输出格式#

#特殊日期

问题描述#

#不高兴的津津

题目描述#

输入描述#

输出描述#

输入输出样例#

#小蓝的漆房

问题描述#

输入格式#

输出格式#

总结:

枚举本质:

解题思路:

注意事项

枚举算法的简介 


枚举算法的介绍>:

<1>枚举通过穷举所有可能的情况来解决问题,本质上就是一种搜索算法

枚举算法的基本思想>:

<1>将问题的所有解的可能都列举出来

<2>根据题目要求验证和比较找到满足问题条件的优解或者所有解

枚举算法的优缺点>:

<1>优点:简单直观,不需要复杂的数学推导,易于实现

<2>缺点:运算量过大,当问题的规模变大的时候,循环的阶数越大,执行速度越慢

枚举算法的运用场景>:

<1>枚举算法适用于问题规模较小、解空间可穷举的情况

枚举算法的运用

#特别数的和


题目描述#

小明对数位中含有2、0、1、9的数字很感兴趣(不包括前导0),在 1 到 40 中这样的数包括 1、2、9、10至32、39和40,共28 个,他们的和是574。
请问,在 1 到 n 中,所有这样的数的和是多少?


输入描述#

输入格式#
输入一行包含两个整数 n (1<=n<=10^4)


输出描述#
输出一行,包含一个整数,表示满足条件的数的和。


输入输出样例#

输入

40

输出

574

#include<bits/stdc++.h>
using namespace std;
bool PanDuan(int n)
{
  while(n)
  {
    int num = n%10;
    if(num == 2||num == 0||num == 1||num == 9)
    {
      return true;
      break;
    }
    n /= 10;
  }
  return false;
}
int main()
{
  int n,sum = 0;
  cin>>n;
  for(int i = 1;i<=n;i++)
  {
    if(PanDuan(i))
    {
      sum += i;
    }
  }
  cout<<sum<<"\n";
  return 0;
}

将 1 到 n 所有的可能都遍历(枚举)一遍,并通过函数来判断是否满足题目需要

 #找到最多的数


问题描述#

在一个 n x m 的矩阵中,有一个数字出现了超过一半的次数,请设计一个高效算法找到这个数字。


输入格式#

输入第一行包含两个整数n和m,表示矩阵的大小(1<=n,m<=10^3)。接下来n行,每行包含m个正整数,表示矩阵中的元素。


输出格式#

输出一个整数,表示矩阵中出现次数超过一半的数字。

样例输入#

3 3
1 2 3
2 2 2
1 2 2

样例输出#

2

库函数 map - 统计元素出现的次数

map<type1,type2> maps

type1是记入的元素,type2是计入的次数


#include <bits/stdc++.h>
using namespace std;
map<int,int> mp;
int main()
{
  int n,m,x;
  cin>>n>>m;
  for(int i=1;i<=n*m;i++)
  {
    cin>>x;
    mp[x]++;
  }
  for(const auto &[x,y]:mp)
{
  if(y*2>n*m)
  {
    cout<<x<<endl;
  }
}
  return 0;
}

#特殊日期

问题描述#

对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从1900年1月1日至9999年12月31日总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。
例如,2022年11月13日满足要求,因为2+0+2+2(1+1)+(1+3)。
请提交满足条件的日期的总数量。


#include<bits/stdc++.h>
using namespace std;
int PanDuan(int n)
{
  int sum = 0;
  while(n)
  {
    sum += n%10;
    n /= 10;
  }
  return sum;
}
int main()
{
  int count = 0;
  int i,j,year,month,days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  for(year = 1900;year<=9999;year++)
  {
     if((year%4 == 0)&&(year%100 != 0)||(year %400 == 0)) //判断闰年
    {
      days[2] = 29;
    }
    else days[2] = 28;
    for(i = 1;i<=12;i++)
    {
     for(j = 1;j<=days[i];j++)
     {
        if( PanDuan(year) ==  PanDuan(i)+ PanDuan(j))
      {
        count++;
      }
     }
    }
  }
  cout<<count<<endl;
  return 0;
}

#不高兴的津津

题目描述#


津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。


输入描述#


输入七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。


输出描述#


输出一个数字。如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用 1,2,3,4,5,6,7 分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的天。


输入输出样例#

输入#

5 3
6 2
7 2
5 3
5 4
0 4
0 6

输出#

3

#include<bits/stdc++.h>
using namespace std;
int main()
{
  int a,b,max = 0,num = 0;
  for(int i = 1;i<=7;i++)
  {
    cin>>a>>b;
    if(a+b>max)
    {
      max = a+b;
      num = i;
    }
  }
  if(num)
  {
    cout<<num;
  }
  else
  {
  cout<<"0";
  }
  return 0;
}

#小蓝的漆房

问题描述#

小蓝是一位有名的漆匠,他的朋友小桥有一个漆房,里面有一条长长的走廊,走廊两旁有许多相邻的房子,每间房子最初被涂上了一种颜色。
小桥来找小蓝,想让他把整个走廊都涂成同一个颜色。小蓝告诉小桥,他每天只能涂一段长度为k的区间。对于每个区间,他可以选择将其中的房子重新涂上任何一种颜色,或者保持原来的颜色不变
小桥想知道小蓝至少要涂几天,才能让整个走廊变得美丽。
请帮助小桥解决这个问题。


输入格式#

第一行包含一个整数t(t<=100),表示测试用例的数量。
每个测试用例的第一行包含两个整数n和k(1<=k<=n<10^4),第二行包含n 个整数 a1,a2,···,an (1<=ai<=60),分别表示每个房子最初的颜色。

1
2


保证所有测试用例中n的总和不超过10^4。

输出格式#

对于每个测试用例,输出一个整数,表示小蓝需要涂漆的最少天数。

样例输入#

2
5 2
1 1 2 2 1
6 2
1 2 2 3 3 3

样例输出#

1
2

#include <bits/stdc++.h>
using namespace std;
int main() {
    int t=0;
    cin >> t;
    while(t--){
        int m,k;
        cin >> m >> k;        
        vector<int> arr(m);    
        set<int> s;     
        for (int i = 0; i < m; i++) {
            cin >> arr[i];
            s.insert(arr[i]);    
        }
        int num = 10000;
        for (auto &x: s) {        //遍历元素
            int sum = 0;
            for (int i = 0; i < m; i++) {
                if (arr[i] == x)continue;        //如果涂到的颜色与此次涂的颜色一致,那么跳过
                sum += 1;                        //如果不一致就加一
                i += k - 1;         //由于是i++,因为一次是涂k区间这么大,所以还需要+k所以这里要-1
            }
            num = min(num, sum);                 //记录最小次数
        }
        cout << num << '\n';
    }
   return 0;
}

总结:

枚举本质:

列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它


解题思路:

1.循环(枚举问题的解)
2.条件判断(筛选问题的解)
3.输出解的形式(输出所有符合题目要求的解或输出解的个数)


注意事项:

<1>枚举时要注意数据范围,列出所有可能情况,不能重复,不能遗漏

<2>枚举时要尽量缩小数据范围,提高计算效率,或者进行优化

<3>根据题目要求注意判断,挑选符合条件的解输出

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

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

相关文章

Linux下安装JET2

0. 说明&#xff1a; JET2是一个基于Joint Evolutionary Trees的利用序列和结构信息预测蛋白质界面的软件&#xff0c;详情见: http://www.lcqb.upmc.fr/JET2/JET2.html&#xff0c;http://www.lgm.upmc.fr/JET/JET.html 和 https://doi.org/10.1371/journal.pcbi.1004580 本…

2024年前端面试中JavaScript的30个高频面试题之中级知识

基础知识 高级知识 13. 什么是闭包?闭包的用例有哪些? 闭包是一个功能,它允许函数捕获定义该函数的环境(或保留对作用域中变量的访问)即使在该作用域已经关闭后。 我们可以说闭包是函数和词法环境的组合,其中定义了该函数。 换句话说,闭包为函数提供了访问自己的作用域、…

vulnhub靶场之DC-5

一.环境搭建 1.靶场描述 DC-5 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing. The plan was for DC-5 to kick it up a notch, so this might not be great for beginners, but should be ok for p…

深度学习笔记(四)——TF2构建基础网络常用函数+简单ML分类网络实现

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解&#xff0c;如有遗漏或错误&#xff0c;欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 TF2基础常用函数 1、张量处理类 强制数据类型转换&#xff1a; a1 tf.constant([1,2,3], dtypetf.floa…

鸿蒙开发环境搭建-高频环境问题解决

1.Node版本问题 由于SDK的部分工具依赖Node.js运行时&#xff0c;推荐使用配套API版本的Node.js&#xff0c;保证工程的兼容性。 匹配关系见下表&#xff1a; API LevelNode.js支持范围API Level≤914.x&#xff08;≥14.19.1&#xff09;、16.xAPI Level>914.x&#xff0…

Linux tail命令详解和高级用法举例

目 录 一、概述 二、tail命令解释 1&#xff0e;命令格式; 2&#xff0e;功能 3&#xff0e;选项 4&#xff0e;选项的基本用法 &#xff08;1&#xff09; 显示行号 &#xff08;2&#xff09;忽略指定字符数 &#xff08;3&#xff09; 不显示文件名 三…

小白进公司快速熟悉环境和代码的方法

1.企业开发模式 企业开发模式里&#xff0c;我们的项目模块可能非常多此时我们是不能将所有模块都拉取到本地的&#xff0c;主要原因如下&#xff1a; 我们很可能并没有全部工程代码的权限 微服务集群部署非常复杂&#xff0c;本地部署成本太高 微服务模块众多&#xff0c;本…

NAND Separate Command Address (SCA) 接口命令解读

CA output packet和CA input packet是Separate Command Address (SCA) NAND接口协议中用于命令和地址传输的关键数据结构。 CA Input Packet: 在SCA接口中&#xff0c;输入到NAND器件的命令和地址信息被组织成并行至串行转换的CA&#xff08;Command and Address&#xff09;输…

装机必看:电脑Bios里的CSM兼容模块是啥?打开有啥用?

前言 最近朋友装了一台新的电脑&#xff0c;用的i5-13490f的CPU。但是由于预算有限&#xff0c;手边只有一块GTX650ti&#xff0c;没办法&#xff0c;只好先这么用着了。 谁知道出现了个大问题&#xff1a;电脑开机居然没办法显示。 由于电脑所有的配件基本上都是全新的&…

查看SQL Server的表字段类型、长度、描述以及是否可为null

文章目录 初步理解小步测试组合一下参考文章有更详细评述 继续理解得到大部分信息 本文参考&#xff1a;https://blog.csdn.net/josjiang1/article/details/80558068。 也可以直接点击这里文章链接&#xff1a; sql server查询表结构&#xff08;字段名&#xff0c;数据类型&a…

Jmeter Linux环境压测Lottery接口

1、把Dubbo插件放到Linux中Jmeter的lib/ext目录下 2、参数化 3、设置线程数 4、把测试计划中的Dubbo路径替换成Linux中的路径 /home/apache-jmeter-5.5/lib/ext 5、上传压测脚本到压力机 6、执行压测&#xff0c;观察是否有消息积压 ①Jmeter中执行压测脚本 ②检查mq控制台是…

开箱即用之 获取系统的CPU、内存、网络、磁盘使用率

页面示例 引入对应pom依赖 <!-- 系统信息相关 --><dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>6.4.0</version></dependency> 代码示例 /*** 获取cpu信息*/public sta…

Javaweb之SpringBootWeb案例查询部门以及前后端联调的详细解析

2.1 查询部门 2.1.1 原型和需求 查询的部门的信息&#xff1a;部门ID、部门名称、修改时间 通过页面原型以及需求描述&#xff0c;我们可以看到&#xff0c;部门查询&#xff0c;是不需要考虑分页操作的。 2.1.2 接口文档 部门列表查询 基本信息 请求路径&#xff1a;/depts …

视频转码:掌握mp4视频格式转FLV视频的技巧,视频批量剪辑方法

在多媒体时代&#xff0c;视频格式的转换成为一种常见的需求。把MP4格式转换为FLV格式&#xff0c;FLV格式的视频文件通常具有较小的文件大小&#xff0c;同时保持了较好的视频质量。批量剪辑视频的方法能大大提高工作效率。下面来看云炫AI智剪如何进行MP4到FLV的转码&#xff…

【Scala】——流程控制

1 if-else 分支控制 让程序有选择的的执行&#xff0c;分支控制有三种&#xff1a;单分支、双分支、多分支 1.1单分支 if (条件表达式) {执行代码块 }1.2 双分支 if (条件表达式) {执行代码块 1 } else {执行代码块 2 }1.3 多分支 if (条件表达式1) {执行代码块 1 } else …

真实可用,Xshell7 期待您的安装使用

xshell https://pan.baidu.com/s/1OKC1sQ1eYq6ZSC8Ez5s0Fg?pwd0531 1.鼠标右击【Xshell7.zip】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09; 2.双击Xshell-7.0.0065.exe 执行安装操作 3.选择【是】 4.点击【下一步】 5.选择【我接受...】 6.点击…

Linux中DNS域名解析服务及实验

一、DNS介绍 1、DNS 是域名系统&#xff0c;应用层协议&#xff0c;是互联网的一项服务&#xff0c;是将域名转换成网络可以识别的IP地址&#xff0c;再通过IP地址访问主机。这种由文字组成的名称更容易记忆。 DNS是“域名系统"的英文缩写。它作为将域名和IP地址相互映…

Android开发基础(四)

Android开发基础&#xff08;四&#xff09; 本篇将从Android数据存储方式去理解Android开发。 Android数据存储方式 Android提供了多种数据存储方式。 一、SharedPreferences存储 主要用于存储一些简单的配置信息&#xff0c;如登录账号密码等&#xff1b; 这种存储方式采…

更换电脑必装软件【mac电脑】快速装机流程

一、安装软件 source treevscodeapifoxchromerectangleclashx pro 二、开发环境构建 安装nvm&#xff0c;参考这篇文章使用nvm 安装node 三、使用vscode 运行 js 文件 3.1 安装vscode插件 code-runner 3.2 如果报错/bin/sh: node: command not found 解决办法&#xff0c…

Java常用类---Math类和Random类

Math类 简介 Java中&#xff0c;Math类包含了用于执行基本数学运算的属性和方法。Math类的方法都被定义为static形式(静态方法)&#xff0c;通过Math类可以直接在主函数中直接调用。 如下图所示&#xff0c;Math.PI等于圆周率π、Math.E等于常量e……等属性和方法。 部分Mat…