2012-2020蓝桥C++ B组蓝桥杯省赛真题(第一题)

本文汇总了历年编程竞赛的若干道题目,包括微生物增殖、日期计算、购物单计算、奖券数目统计等,涉及算法分析和编程实现。通过解决这些问题,展示了选手在面对实际问题时如何运用逻辑思维和编程技巧寻找解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://t.csdn.cn/zTemz   原文链接

目录

2012 第一题:微生物增殖

2013第一题:高斯日记

2014第一题:啤酒和饮料

2015第一题:奖券数目

2016 第一题:煤球数目

2017第一题:购物单

2018第一题:第几天

2019第一题:组队

2020第一场 第一题:跑步训练

2020第二场 第一题:门牌制作


2012 第一题:微生物增殖

题目描述
假设有两种微生物X和Y,X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。一个新出生的X,半分钟之后吃掉1个Y,且从此开始每隔1分钟吃掉1个Y。已知新出生的X=10,Y=89,求60分钟后Y的数目。若X=10,Y=90呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。
题目分析
从题目中知道Y是每2分钟分裂一次,所以我们只要知道X的变化,每次X吃掉Y的数目后面算出来就可以了,这个也可以叫做控制变量法,从X得出Y.
本题需要从前几次的分裂情况可以发现X暗藏的规律,1小时有120个半分钟,我列了一个表格如下:

从上面表格可以分析出不论是新出生的还是以前的X,都是每半分钟进行吃Y的操作,每3分钟进行一次分裂,故这题的操作如下
在60分钟内进行判断:

1.如果为每个0.5分钟,除2余1, Y=Y-X
2.如果为每个3分钟,被6整除, X=X*2
3.如果为每个2分钟,被4整除,Y=Y*2

题目代码

#include<iostream>
using namespace std;

int main()
{
    int  x = 10, y = 89;
    for(int i = 1; i <=120; i++)
    {
        if(i%2==1)
        {
            y = y - x;
        }

        if(i%4== 0)//2分钟有4个0.5
        {
            y =y* 2;
        }
        if(i%6==0)//3分钟有6个0.5
        {
            x = x*2;
        }
    }
    cout << "x = "<< x << endl <<"y = "<< y;


    return 0;
}

题目答案 

x = 10485760
y = -979369984//表示微生物Y为0,灭绝

2013第一题:高斯日记

题目描述
大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210。后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于1777年4月30日,在高斯发现的一个重要定理的日记上标注着5343,因此可算出那天是1791年12月15日。高斯获得博士学位的那天日记上标着8113,请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd,例如:1980-03-21
题目分析
首先确定发生事件的年份,就是用总的天数减去每年天数
然后确定在该年的月份以及日期。
题目代码

#include <iostream>

using namespace std;
//判断闰年
bool leap_year(int year)
{
    return (year%400==0)||((year%4==0)&&(year%100!=0));
}
//yearday 这一年的天数,num 除年以外的总天数
int main()
{
    int n;
    cin >>n;
    //1777-04-30;
    int num = n+31+28+31+30-1;

    int days[13]= {0,31,0,31,30,31,30,31,31,30,31,30,31};
    int year = 1777,month=0,day =0;

    int yearday;
    while(1)
    {
        if(leap_year(year))
        {
            yearday=366;
        }
        else
        {
            yearday=365;
        }
        if(num<yearday)
        {
            break;
        }
        num=num -yearday;
        year ++;

    }

    //闰年二月
    if(leap_year(year))
    {
        days[2]=29;
    }
    else
    {
        days[2]=28;
    }
    month=1;
    for(int i=1; i<=12; i++)
    {

        if(num>days[i])
        {
            num =num-days[i];
            month++;
        }else break;


    }

    cout<<year<<"-"<<month<<"-"<<num;

//    cout<<year<<"-";
//    if(month<10)
//        cout<<"0"<<month<<"-";
//    else cout<<month<<"-";
//    if(day<10)
//        cout<<"0"<<day;
//    else cout <<day;



    return 0;
}

题目答案

1799-07-16

2014第一题:啤酒和饮料

题目描述
啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。
题目分析
简单的循环暴力,两层循环就可
题目代码

#include <iostream>
using namespace std;

int main()
{
    //x为啤酒,y为饮料
    for(int x=1; x<823/23; x++)
    {
        for(int y=1; y<823/19; y++)
        {
            if(23*x+19*y==823)
            {
                if(x<y)
                {
                    cout << x <<ends << y <<endl;
                }

            }
        }
    }
    return 0;
}

题目答案

啤酒 11

2015第一题:奖券数目

题目描述
有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。
请提交该数字(一个整数),不要写任何多余的内容或说明性文字。
题目分析


暴力手法,5层循环,脱了裤子放屁
题目代码 

#include <iostream>

using namespace std;

int main()
{
    int num =0;
    for(int i=1; i<9; i++)
    {
        for(int j=1; j<10; j++)
        {
            for(int k=1; k<10; k++)
            {
                for (int m=1; m<10; m++)
                {
                    for(int n=1; n<10; n++)
                    {
                        num++;
                    }
                }
            }
        }
    }
    cout<<num;
    return 0;
}

题目答案

52488

2016 第一题:煤球数目

题目描述
有一堆煤球,堆成三角棱锥形。具体:第一层放1个,第二层3个(排列成三角形),第三层6(排列成三角形),第四层10个(排列成三角形),…如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
题目分析

该题目是一个模拟题,首先找出他的规律
第一层 1
第二层 1+2
第三层 1+2+3
第四层 1+2+3+4
可以看出他的规律了,就是依次加,最后的要求是求全部的煤球数
题目代码

#include <iostream>

using namespace std;

int main()
{
    //sum表示总煤球数,temp表示每层的数目
    int sum =0,temp=0;
    for (int i=1; i<=100; i++)
    {
        temp=temp+i;
        sum = sum+temp;
    }
    cout << sum << endl;
    return 0;
}

题目答案

171700

2017第一题:购物单

题目描述
小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场物。小明很厌烦,但又不好推辞。
这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。小明也有个怪癖不到万不得已,从不刷卡,直接现金搞定。现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。
取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多少现金。以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。
以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。
-----------------
****     180.90       88折
****      10.25       65折
****      56.14        9折
****     104.65        9折
****     100.30       88折
****     297.15        半价
****      26.75       65折
****     130.62        半价
****     240.28       58折
****     270.62        8折
****     115.87       88折
****     247.34       95折
****      73.21        9折
****     101.00        半价
****      79.54        半价
****     278.44        7折
****     199.26        半价
****      12.97        9折
****     166.30       78折
****     125.50       58折
****      84.98        9折
****     113.35       68折
****     166.57        半价
****      42.56        9折
****      81.90       95折
****     131.78        8折
****     255.89       78折
****     109.17        9折
****     146.69       68折
****     139.33       65折
****     141.16       78折
****     154.74        8折
****      59.42        8折
****      85.44       68折
****     293.70       88折
****     261.79       65折
****      11.30       88折
****     268.27       58折
****     128.29       88折
****     251.03        8折
****     208.39       75折
****     128.88       75折
****      62.06        9折
****     225.87       75折
****      12.89       75折
****      34.28       75折
****      62.16       58折
****     129.12        半价
****     218.37        半价
****     289.69        8折
--------------------
题目分析

将数据复制到excel中,数据->分列,把88折这些手动改成0.88这些,用product函数,再用sum函数。

题目答案:

5200

2018第一题:第几天

题目描述
2000年的1月1日,是那一年的第1天。
那么,2000年的5月4日,是那一年的第几天?
注意:需要提交的是一个整数,不要填写任何多余内容。

题目分析

1.能被4整除,且不能被100整除的,是闰年。2.世纪年份能被400整除的是闰年。

((year%4==0)&&(year%100!=0))||(year%400==0)

直接手算吧,历届蓝桥杯算日期中最简单的一道题,一三五七八十腊,31天。其余30,闰年二月29,普通28;
题目代码

#include<iostream>

using namespace std;
int main()
{
	//首先2000年是闰年 2月29天 
	int ans = 31+29+31+30+4;
	cout << ans <<endl;
	return 0; 
} 

题目答案

125

2019第一题:组队

题目描述
作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员,组成球队的首发阵容。每位球员担任 1号位至 5号位时的评分如下表所示。请你计算首发阵容 1号位至5号位的评分之和最大可能是多少?

1 97 90 0 0 0
2 92 85 96 0 0
3 0 0 0 0 93
4 0 0 0 80 86
5 89 83 97 0 0
6 82 86 0 0 0
7 0 0 0 87 90
8 0 97 96 0 0
9 0 0 89 0 0
10 95 99 0 0 0
11 0 0 96 97 0
12 0 0 0 93 98
13 94 91 0 0 0
14 0 83 87 0 0
15 0 0 98 97 98
16 0 0 0 93 86
17 98 83 99 98 81
18 93 87 92 96 98
19 0 0 0 89 92
20 0 99 96 95 81

题目分析

把数据复制到excel表格

 题目答案

490

2020第一场 第一题:跑步训练

题目描述
小明要做一个跑步训练。
初始时,小明充满体力,体力值计为 10000 。如果小明跑步,每分钟损耗 600 的体力。如果小明休息,每分钟增加 300 的体力。体力的损耗和增加都是均匀变化的。
小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。如果某个时刻小明的体力到达 0 ,他就停止锻炼。
请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。答案中只填写数,不填写单位。
题目分析
由题意,在每个2分钟里,消耗300,由于在每个2分钟后是消耗,因此体力在出现小于600时,在接下来的1分钟内,体力就会消耗殆尽,在 32个两分钟,也就是64分钟时,体力剩余400。
题目代码

#include <iostream>

using namespace std;

int main()
{
    int n=10000;
    int run = 600/60;//跑步时每秒的消耗
    int time=0;
    while(n)
    {
        if(n-600<0)
        {
            time=time+n/run;
            break;
        }


        n=n-600;
        n=n+300;
        time=time+120;
    }
    cout<<time;
    return 0;
}

2020第二场 第一题:门牌制作

题目描述
小蓝要为一条街的住户制作门牌号。这条街一共有2020位住户,门牌号从1到2020编号。小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。请问要制作所有的1到2020号门牌,总共需要多少个字符2?
题目分析
暴力搜索,判断每个位置的字符是否满足条件
题目代码

#include <iostream>

using namespace std;
//判断每一个数中有多少个2
//法一:非递归
int judge(int num)
{
    int counter=0;
    while(num)
    {
        if(num%10==2)
        {
            counter++;
        }
        num =num/10;
    }
    return counter;
}
//法二:递归
int shu=0;
void much_two(int n){
    if(n==0){
        return;
    }
    if(n%10==2){
       shu++;
    }
    if(n){
     n=n/10;
    }
    much_two(n);
}
int main()
{
    int sum=0;
    for(int i=1; i<=2020; i++)
    {
//        法一
        sum = sum+judge(i);
//        法二
        much_two(i);
    }
    cout<<"法一:"<<sum<<endl;
    cout<<"法二:"<<shu;

    return 0;
}

题目答案

624

第一题: 解密

题目描述
小明设计了一种文章加密的方法:对于每个字母 c,将它变成某个另外的字符 Tc。下表给出了字符变换的规则:

 例如,将字符串 YeRi 加密可得字符串 EaFn。
小明有一个随机的字符串,加密后为:EaFnjISplhFviDhwFbEjRjfIBBkRyY
(由 30 个大小写英文字母组成,不包含换行符),请问原字符串是多少?
(如果你把以上字符串和表格复制到文本文件中,请务必检查复制的内容
是否与文档中的一致。在试题目录下有一个文件 str.txt,第一行为上面的字符
串,后面 52 行依次为表格中的内容。)
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
只包含 30 个大小写英文字母的字符串,在提交答案时只填写这个字符串,填写
多余的内容将无法得分。

 题目分析

 题目答案

YeRikGSunlRzgDlvRwYkXkrGWWhXaA
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值