蓝桥杯之模拟与枚举day1

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 发布!

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

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

相关文章

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

持续交付&#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…

集简云银行系统:API连接广告推广与客服系统,降低企业研发成本

连接多元化软件系统的挑战 在企业进行业财税一体化的进程中&#xff0c;以及企业数字化进程中&#xff0c;企业需要连接多个软件系统。然而&#xff0c;随着业务的发展&#xff0c;使用的软件越来越多&#xff0c;软件与软件之间的连接和数据同步成为了一个挑战。这在公司的财…

webrtc推拉流 srs报错:DTLS_HANG DTLS: > Hang, done=0, version=-1, arq=0

执行了./objs/srs -c conf/rtc.conf 打开了srs的推拉流网页&#xff1a; 推流 拉流 srs报错如下&#xff1a; [2023-11-08 21:55:23.489][Warn][44992][8xvf4d62][104][DTLS_HANG] DTLS: Hang, done0, version-1, arq0 观看srs日志&#xff0c;在sdp offer&#xff0c;answer…

立体库堆垛机提升电机运行动作功能块

形成允许提升定位距离误差其误差值可要据现场实际更改 进入提升定位范围内

Jmeter测试基本使用

操作 右击Test Plan添加用户组&#xff0c;在用户组下右击添加所需的其他组件。一般来说添加发送请求一定会添加取样器(http请求类型)&#xff0c;在取样器中添加对应的http/https请求等基本信息。取样器的执行顺序就是在线程组中添加的取样器的顺序进行执行http请求为了查看请…

Redis6的IO多线程分析

性能测试 机器配置 C Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 14 On-line CPU(s) list: 0-13 Mem: 62G性能 配置推荐 官方表示&#xff0c;当使用redis时有性能瓶…

C++初阶(十)模板初阶

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、泛型编程1、如何实现一个通用的交换函数呢&#xff1f;2、引出模板 二、函数模板1、函数模…

3DMAX汽车绑定动画模拟插件MadCar疯狂汽车使用教程

3DMAX汽车绑定动画模拟插件MadCar疯狂的汽车&#xff0c;用于通过模拟控制来快速装配轮式车辆及其动画。这个新版本允许装配任何数量的车轮的车辆&#xff0c;以及包括摩托车在内的任何相互布置。还支持任意数量的拖车。 每个车轮和悬架都有简化的行为设置以及微调&#xff0c…

Linux开发工具之软件包管理器 yum

文章目录 1.了解yum1.1yum的介绍1.2yum的作用 2.了解软件包3.yum三板斧3.1查看软件包3.2安装软件3.3移除软件3.4centos7有趣的软件 1.了解yum 1.1yum的介绍 一般原生的Linux系统&#xff0c;内置的下载链接基本都是配套的国外的网址 上图中的软件发布平台是国外的 因为我们国家…

【数据结构】反射、枚举

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 反射、枚举 1. 反射1.1 定义1.2 反射…

【Java0基础学Java第八颗】 -- 继承与多态 -- 继承

8.继承与多态 8.1 继承8.1.1 为什么需要继承8.1.2 继承概念8.1.3 继承的语法8.1.4 super关键字8.1.5 父类成员访问子类中访问父类的成员变量子类中访问父类的成员方法 8.1.6 子类构造方法8.1.7 super和this8.1.8 再谈初始化8.1.9 protected 关键字同一包中同一类同一包中不同的…

Linux Vim批量注释和自定义注释

使用 Vim 编辑 Shell 脚本&#xff0c;在进行调试时&#xff0c;需要进行多行的注释&#xff0c;每次都要先切换到输入模式&#xff0c;在行首输入注释符"#"再退回命令模式&#xff0c;非常麻烦。连续行的注释其实可以用替换命令来完成。 换句话说&#xff0c;在指定…

NFS服务器的搭建

架设一台NFS服务器&#xff0c;并按照以下要求配置 准备阶段&#xff1a;准备两台虚拟机&#xff0c;一台作为服务端&#xff0c;一台作为客户端 服务端&#xff08;Server&#xff09;&#xff1a;192.168.75.139 客户端&#xff08;Client&#xff09;:192.168.75.160 两…

Python tkinter实现复刻Windows记事本UI和菜单的文本编辑器(二)

上一篇&#xff1a;Python tkinter实现复刻Windows记事本UI和菜单的文本编辑器&#xff08;一&#xff09;-CSDN博客 下一篇&#xff1a;敬请耐心等待&#xff0c;如发现BUG以及建议&#xff0c;请在评论区发表&#xff0c;谢谢&#xff01; 相对上一篇文章&#xff0c;本片文…

算术运算符、自增自减运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符

1.算术运算符 public class OperatorDemo1 {public static void main(String[] args) {int a 10;int b 2;System.out.println(a b);System.out.println(a - b);System.out.println(a * b);System.out.println(a / b);System.out.println(5 / 2);System.out.println(5.0 / 2);…

vue3 + antd 图片上传 (精简篇)cv即可

使用antd组件库里的 a-upload 上传图片 template代码&#xff1a; <a-upload name"idCardzm" list-type"picture-card" class"avatar-uploader" :show-upload-list"false":before-upload"beforeUpload" :customRequest…

LINUX入门篇【5】----程序的翻译过程解析

前言&#xff1a; 在C语言阶段我们已经讲过程序的翻译过程&#xff0c;我们知道程序是由预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接四部分组成的&#xff0c;但是&#xff0c;当时受到C语言编译器的限制&#xff0c;我们没法去深刻体会这个过程&#xff0c;所以…

软件研发团队适用的项目管理工具推荐

Zoho Projects是一款专为大型产研团队设计的项目管理工具&#xff0c;它也是许多软件开发行业高速成长背后的生产线。与其他项目管理产品相比&#xff0c;Zoho Projects最大的不同之处在于其独特的流程设计。在软件上线初期&#xff0c;Zoho Projects能够有效地帮助软件研发公司…

mac使用VMware Fusion安装Centos 7系统

mac主机芯片&#xff1a;Apple M2 Pro VMware-Fusion&#xff1a;13.5 centos&#xff1a;7 第一次操作&#xff1a; 按步骤选择操作系统 在选择虚拟启动虚拟机没有安装centos的界面 而是下图 改动&#xff1a;把UEFI换成BIOS ——>无果 第二次操作&#xff1a; 直接…

数据仓库工具箱-第三章-零售业务

文章目录 一、维度模型设计的4步过程1.1 第一步&#xff1a;选择业务过程1.2 第二步&#xff1a;声明粒度1.3 第三步&#xff1a;确定维度1.4 第四步&#xff1a;确定事实 二、零售业务案例研究2.1 第一步&#xff1a;选择业务过程2.2 第二步&#xff1a;声明粒度2.3 第三步&am…