蓝桥杯之模拟与枚举day1

news2024/11/25 21:28:36

Question1卡片(C/C++A组第一题)

file 这个是一道简单的模拟枚举题目,只要把对应每次的i的各个位都提取出来,然后对应的卡片数目减去1即可。属于打卡题目。注意for循环的特殊使用即可

#include <iostream>
using namespace std;
bool solve(int a[],int n)
{
  //模拟枚举
  while(n!=0)
  {
    int tmp = n % 10;
    n /= 10;
    a[tmp]--;
    if(a[tmp]<0)
      return false;
  }
  return true;
}
int main()
{
  int cnt[10] = {0};
  // 请在此输入您的代码
  for(int i = 0; i <= 9 ;i++)
    cnt[i] = 2021;
  // int ret = 1;
  // bool flag = true;
  // flag = solve(cnt,1);
  // while(flag)
  // {
  //   ret++;
  //   flag = solve(cnt,ret);
  // }
  /*
  也可以用for循环
  */
  for(int i = 1; ;i++)
    if(!solve(cnt,i)){
    cout<<i-1<<endl;
    return 0;}
  //记得最后要减去1
  // cout<<ret-1<<endl;
  return 0;
}

file

Question2回文日期(C/C++A组第七题)

file 在蓝桥杯官网上面显示这个题目属于困难,但是实际上很简单。直接枚举就行,但是注意要如何进行枚举,日期30进1,月份12进1。想清楚这个就是很简单的枚举了

//
// Created by jjh on 2023/11/10.
//
#include<iostream>
using namespace std;
/*
思路:
1、难点在于日期的遍历,要考虑好怎么进行进位
2、回文日期的判断,用一个八位数组就行
3、ABABBABA型特殊判断
*/
bool huiwen(int d)//回文字符串
{
    int a[8];
    for(int i = 0; i < 8; i++)
    {
        int tmp = d % 10;
        a[7 - i] = tmp;
        d = d / 10;
    }
    int i = 0;
    while(a[i] == a[7-i])
        i++;
    return i>4;
}
bool huiwen1(int d)//特殊回文串判断
{

    int a[8];
    for(int i = 0; i < 8; i++)
    {
        int tmp = d % 10;
        a[7 - i] = tmp;
        d = d / 10;
    }
    if(a[0] == a[2] && a[2] == a[5] && a[5] == a[7] )
        if(a[1] == a[3] && a[3] == a[4] && a[4] == a[6])
            if(a[0]!=a[1])
                return true;
    return false;
}
int main(){
    /*
    遍历日期,年 月 日
    日是30进一位,月是12进一位
    */
    bool flag = false,flag1 = false;
    int ans1 = 0,ans = 0,d0;
    string d;
    cin>>d;
    d0 = stoi(d);//转化为数组
    int first = d0;
    while(true)
    {
        if(huiwen(d0)&&!flag&&d0!=first){
            ans = d0;
            flag = true;
        }
        if(huiwen1(d0)&&!flag1&&d0!=first)
        {
            ans1 = d0;
            flag1 = true;
        }
        if(flag&&flag1)
        {
            cout<<ans<<endl<<ans1<<endl;
            return 0;
        }
        int tmp = d0 % 100;//获取日期最后两位
        tmp++;
        if(tmp > 30)
        {
            int tmp1 = d0/100;
            int tmp2 = tmp1;
            tmp1 %= 100;
            tmp1++;
            if(tmp1 > 12)
            {
                d0 = (((tmp2/100)+1)*100 + 1)*100 + 1;
                continue;
            }
            else
            {
                d0 = (tmp2 +1)*100 + 1;
                continue;
            }
        }
        d0++;
    }

    return 0;
}

Question3(C/C++A组第四题)赢球票

file 这个也是一道模拟的题目,难点在于如何拆分问题。面对这个问题,要有几个思考。

怎么在链上模拟环的移动?

这个是好办的,当pos = n的时候,我们将其归为为1即可。pos = 1

如何表示被拿走的卡片?

被拿走的卡片我们是不能访问计数的,用一个flag数组表示即可解决问题,但是在不同位置开始遍历的时候记得清零

哪个位置开始取得最大值?

这个问题我们是不知道的,所以要进行枚举,每一个位置都模拟一轮

游戏如何结束?

当我们选择的卡片数量为n的时候或者当我们数到的数比所有卡片的数量还要多!

tips:注意输出的答案不是能选择的最多卡片数目,而是能够赢得的最多球票数目,及卡片所代表的值!

代码:

//
// Created by jjh on 2023/11/10.
//
#include <iostream>
#include <cstring>

using namespace std;
/*
 * 思路:
 * 1、数组模拟环上面的移动
 * 2、flag[i] = 1表示i处已经被移走
 * 3、当已经移走所有卡片或者当前数的数大于n
 * */
int main(){
    int n,maxx = INT_MIN;
    cin>>n;
    int flag[n+1],a[n+1];

    memset(a,0,sizeof(a));
    for(int i = 1; i <= n; i++)
        cin>>a[i];
    for(int i = 1; i <= n; i++)
    {
        memset(flag,false,sizeof(flag));
        int pos = i,cnt = 1,ans = 0,sum = 0;
//        while(cnt <= n && ans < n)
            while(1)
            {
              if(!flag[pos])
              {
                  if(a[pos] == cnt)
                  {
                      sum += a[pos];
                      flag[pos] = true;
                      pos++;
                      ans++;
                      if(pos > n)
                          pos = 1;
                      cnt = 1;
                  }else
                  {
                      cnt++;
                      pos++;
                      if(pos > n)
                          pos = 1;
                  }
              }
              else
              {
                  pos++;
                  if(pos > n)
                      pos = 1;
              }
                if(cnt > n || ans == n)
                    break;
            }
            maxx = max(maxx,sum);

    }
    cout<<maxx<<endl;
    return 0;
}

Question4(C/C++A组第二题)

file 实质上就是看你会不会求最大公约数!打卡题

//
// Created by jjh on 2023/11/10.
//
#include <iostream>
using namespace std;
/*
 * 思路:本质上就是一个判断最大公约数的题目,暴力枚举就行
 * */
int check(int i,int j)
{
    return j == 0 ? i : check(j,i%j);
}
long long ans;
int main(){
    for(int i = 1; i <= 2020;i++)
        for(int j = 1; j <= 2020;j++)
            if(check(i,j) == 1)
                ans++;
    cout<<ans<<endl;
    return 0;
}

Question5(C/C++A组第4题)数的分解

file 这个显然是一个暴力枚举法,记得去重就可。

易得:

   for(int i = 1; i <= 2019;i++)
        for(int j = 1 ;j <= 2019 ;j++)
            for(int k = 1; k <= 2019;k++)
                if(i + j + k == 2019 && !check(i)&&!check(j)&&!check(k)&&i!=j&&j!=k&&i!=k)
                    ans++;
       ans/=6;

但是这个复杂度太高了,那能不能进行优化呢?当然是可以的!

首先我们可以确定i,j,k的次序,省去去重操作了。

还有就是我们可以利用flag数组提前计算出哪些数字包含有2/4。进一步,我们实际上可以利用两重循环来解决问题,k那层直接用 2019 -i - j代替.!

//
// Created by jjh on 2023/11/10.
//
#include <iostream>
using namespace std;
int n;
/*
 * 题目关键点:
 * 1、如何去重
 * 2、如何判断是否含有数字2或者4
 * */
bool check(int n)
{
    bool flag = false;
    while(n!=0&&!flag)
    {
        int tmp = n % 10;
        n /= 10;
        if(tmp == 2 || tmp == 4)
            flag = true;
    }
    return flag;
}
long long ans;
bool flag[2020];
int main(){

    for(int i = 1 ;i <= 2019;i++)if(check(i))flag[i] = true;
//    for(int i = 1; i <= 2019;i++)
//        for(int j = 1 ;j <= 2019 ;j++)
//            for(int k = 1; k <= 2019;k++)
//                if(i + j + k == 2019 && !check(i)&&!check(j)&&!check(k))
//                    ans++;
    //去重

//    cout<<ans / 6<<endl;
    for(int i = 1; i <= 2019;i++)
        for(int j = i+1;j < 2019 - i - j;j++)
            if(!flag[i] && !flag[j] &&!flag[2019 - i - j])
                ans++;
    cout<<ans<<endl;
    return 0;
}

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

Android逆向fiddler抓包工具——理解HTTP协议

HTTP协议格式 HTTP协议是一种应用非常广泛的应用层协议&#xff0c;当我们在浏览器中输入一个URL(“网址”)时&#xff0c;浏览器就会给客户端发送一个HTTP请求&#xff0c;服务器收到请求之后&#xff0c;就会返回一个HTTP响应。 为了能够看到HTTP请求和响应的详细内容&…

SQL触发器

触发器是与表有关的数据库对象。 在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触发并执行触发 器中定义的SQL语句集合。 触发器的这种特性可以协助应用在数据库端确保数据的完整性, 日志记录 , 数据校验等操作 。 使用别名OLD和NEW来引用触发器中发生变化的…

linux系统中查看防火墙开放的端口状态 开放端口和禁用端口号操作命令

一、查看防火墙状态 查看防火墙状态&#xff1a;systemctl status firewalld 开启防火墙&#xff1a;systemctl start firewalld 关闭防火墙&#xff1a;systemctl stop firewalld 若遇到无法开启 先用&#xff1a;systemctl unmask firewalld.service 然后&#xff1a;s…

1.3数据结构之复杂度 力扣题目移除元素

移除元素首先我们可能会想到内存的释放&#xff0c;但是内存的释放是一次性的&#xff0c;不能断断续续&#xff0c;所以不能直接free掉。 思路1&#xff1a;时间复杂度是&#xff1a;O(n) 空间复杂度是&#xff1a;O(n) 思路2&#xff1a;时间复杂度&#xff1a;O(n) 空间复…

TortoiseSVN 状态图标不显示的两种解决办法

文章目录 TortoiseSVN 方式解决注册表方式解决 TortoiseSVN 方式解决 在桌面或者资源管理器中鼠标右键打开 TortoiseSVN 设置选择 Icon Overlays (图标覆盖)Status cache&#xff08;状态缓存&#xff09; 选择 ‘Shell’ 选择 Icon Overlays&#xff08;图标覆盖&#xff09;…

在软件测试过程中如何有效的开展接口自动化测试!

一.简介 接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中&#xff0c;通过对接口的自动化测试来提高测试效率和测试质量&#xff0c;减少人工测试的工作量和测试成本&#xff0c;并且能够快速发现和修复接口错误&…

ARMday04(开发版简介、LED点灯)

开发版简介 开发板为stm32MP157AAA,附加一个拓展版 硬件相关基础知识 PCB PCB&#xff08; Printed Circuit Board&#xff09;&#xff0c;中文名称为印制电路板&#xff0c;又称印刷线路板&#xff0c;是重要的电子部件&#xff0c;是电子元器件的支撑体&#xff0c;是电子…

JVM虚拟机-虚拟机性能监控、故障处理工具

1基础故障处理工具 jps&#xff08;JVM Process Status Tool&#xff09;是&#xff1a;虚拟机进程状况工具 作用&#xff1a;可以列出正在运行的虚拟机进程&#xff0c;并显示虚拟机执行主类&#xff08;Main Class&#xff0c;main()函数所在的类&#xff09;名称以及这些进…

人工智能数学基础3:用Python 编程求极限

求极限&#xff0c;并用Python 编程求极限 使用洛必达法则来求解 利用泰勒展开的方法来求解这个极限 import sympyx sympy.Symbol(x) f (sympy.sin(x) - x * sympy.cos(x)) / (sympy.sin(x) ** 3)limit_value sympy.limit(f, x, 0) print(limit_value)

【QT】qt打包程序后无法正常启动

本人在自己电脑上打包Qt程序后可以正常运行&#xff0c;但换了个电脑就无法运行了&#xff0c;显示应用程序无法正常启动&#xff08;0xc000007b&#xff09;。 造成这种情况的原因是因为系统变量的原因&#xff0c;我用的win10自带的cmd。 应该采用Qt自带的cmd&#xff0c;打开…

人工智能基础——python:Pandas与数据处理

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

四入进博会,优衣库围绕科技可持续演绎“服装进化论”

11月5日&#xff0c;第六届中国国际进口博览会在上海拉开帷幕。这些年来&#xff0c;进博巨大的平台效应&#xff0c;使其成为各个行业头部品牌的秀场&#xff0c;也持续为消费者、产业链带来惊喜。 今年&#xff0c;也是全球服装界科技知名品牌——优衣库的第四次进博之旅。从…

OpenCV校准棋盘集合

棋盘格可以与相机校准工具一起使用&#xff0c;例如ROS的camera_calibration包。您可以通过单击下面的任何链接免费下载 PDF 格式的各种棋盘&#xff0c;没有水印或广告。此外&#xff0c;还添加了基于 JavaScript 的棋盘生成器&#xff0c;允许您生成自定义尺寸。 提示&#…

《持续交付:发布可靠软件的系统方法》- 读书笔记(十三)

持续交付&#xff1a;发布可靠软件的系统方法&#xff08;十三&#xff09; 第 13 章 组件和依赖管理13.1 引言13.2 保持应用程序可发布13.2.1 将新功能隐蔽起来&#xff0c;直到它完成为止13.2.2 所有修改都是增量式的13.2.3 通过抽象来模拟分支 13.3 依赖13.3.1 依赖地狱13.3…

AlphaControls控件TsRadioGroup的使用

通常使用AlphaControls控件中的TsRadioGroup时&#xff0c;往往使用默认值&#xff0c;会造成TsRadioGroup标题被TsRadioGroup的ITEMs占用&#xff0c;严重影响美观&#xff1a; 解决方案&#xff0c;通过对TsRadioGroup的ContentVOffset属性&#xff0c;设置为10。即可立即改善…

计算机网络实验

计算机网络实验 使用软件PT7.0按照上面的拓扑结构建立网络&#xff0c;进行合理配置&#xff0c;使得所有计算机之间能够互相通信。并且修改各交换机的系统名称为&#xff1a;学号_编号&#xff0c;如你的学号为123&#xff0c;交换机Switch0的编号为0&#xff0c;则系统名称为…

linuxC语言缓冲区及小程序的实现

文章目录 1.文件缓冲区1.1介绍1.2缓冲文件系统1.3冲刷函数fflush1.4认识linux下的缓冲区 2.linux小程序的实现2.1 回车\r和换行\n2.2倒计时程序2.3进度条小程序sleep/usleep代码运行结果 1.文件缓冲区 1.1介绍 为缓和 CPU 与 I/O 设备之间速度不匹配&#xff0c;文件缓冲区用以…

matlab命令行窗口结果显示不全,解析式太长,输出不完整解决办法

一、背景 在运行matlab程序时&#xff0c;有时输出结果太长&#xff0c;命令行窗口无论怎么拉大都显示不全&#xff0c;复制结果也是会有…&#xff0c;而不是完整结果&#xff0c;如下图所示&#xff1a; 双击复制结果显示如下&#xff1a; y: (25exp(-8x)(10exp(8x) - 9))/…

归并分治 笔记

归并分治 前置知识&#xff1a;讲解021-归并排序 原理&#xff1a; (1&#xff09;思考一个问题在大范围上的答案&#xff0c;是否等于&#xff0c;左部分的答案 右部分的答案 跨越左右产生的答案(2&#xff09;计算“跨越左右产生的答案”时&#xff0c;如果加上左、右各自…

ros1 基础学习09 -自定义service服务开发示例

自定义service服务开发示例 如何使用服务一、模型图二、创建功能包三、自定义服务数据3.1 在package.xml中添加功能包依赖3.2 在CmakeLists.txt中添加编译选项3.3 编译生成的C文件和Python库4.1.2 编译整个工作空间 测试&#xff1a; 在ROS中&#xff0c;除了消息这种通信类型外…