第十三届蓝桥杯大赛软件赛省赛(b组c语言)

 试题 A: 九进制转十进制

本题总分:5 分

【问题描述】

九进制正整数 (2022)9 转换成十进制等于多少p>

这道题没什么说的,2*9*9*9+0*9*9+2*9+2*1=1478;

 

 

试题 B: 顺子日期

本题总分:5 分

【问题描述】

小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日

期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺

子的日期。例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123; 

而 20221023 则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022

年份中,一共有多少个顺子日期。

这道题我感觉有歧义,因为我在写的时候不懂出题人怎么想的,012按照题目的说法应该也算,但是为什么20220123出现的不是两个顺子呢p>

这个用笔写就好了,很快,如果012也算的话应该是14个,否则就是4个,分别是20220123,20221123,20221230,20221231.

我就写了四个,不知道老师按哪个改了。

 

 

试题 C: 刷题统计

时间限制: 1.0s 

内存限制: 256.0MB 

本题总分:10 分

【问题描述】

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天

做 a 道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在

第几天实现做题数大于等于 n 题p>

【输入格式】

输入一行包含三个整数 a, b 和 n.

【输出格式】

输出一个整数代表天数。

【样例输入】

10 20 99

【样例输出】

8

 

#include

int main(){

int a,b,n,ans,sum,i,w;

scanf(“%d%d%d”,&a,&b,&n);

sum=0;

w=1;

for(i=1;;i++){

    if(w

        sum+=a;

    }

    else{

        sum+=b;

    }

    if(sum>=n){

        printf(“%d”,i);

        break;

    }

    w++;

    if(w>7){

        w=1;

        }

    }

return 0;

}

这题比计蒜客的阴历阳历放假要简单,只要考虑好一周的循环就好。

试题 D: 修剪灌木

时间限制: 1.0s 

内存限制: 256.0MB 

本题总分:10 分

【问题描述】

爱丽丝要完成一项修剪灌木的工作。

有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌

木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,

每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开

始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。

灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。在第一天的

早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。

【输入格式】

一个正整数 N ,含义如题面所述。

【输出格式】

输出 N 行,每行一个整数,第行表示从左到右第 i 棵树最高能长到多高。

【样例输入】

3

【样例输出】

4

2

4

 

 

#include

char s[20];

int main(){

int n,i;

scanf(“%d”,&n);

for(i=1;i

if(i

s[i]=(n-i)*2;

}

else{

s[i]=(i-1)*2;

}

}

for(i=1;i

printf(“%dn”,s[i]);

}

return 0;

}

这道题我们画几个就可以发现规律,在前半部分的最长其实就是他剩余部分的两倍,后半部分也是这样。

 

 

 

 

试题 E: X 进制减法

时间限制: 1.0s 

内存限制: 256.0MB 

本题总分:15 分

【问题描述】

进制规定了数字在数位上逢几进一。

X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某

种 X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则

X 进制数 321 转换为十进制数为 65。

现在有两个 X 进制表示的整数 A 和 B,但是其具体每一数位的进制还不确

定,只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制,最低为二进

制。请你算出 A ? B 的结果最小可能是多少。

请注意,你需要保证 A 和 B 在 X 进制下都是合法的,即每一数位上的数

字要小于其进制。

【输入格式】

第一行一个正整数 N,含义如题面所述。

第二行一个正整数 Ma,表示 X 进制数 A 的位数。

第三行 Ma 个用空格分开的整数,表示 X 进制数 A 按从高位到低位顺序各

个数位上的数字在十进制下的表示。

第四行一个正整数 Mb,表示 X 进制数 B 的位数。

第五行 Mb 个用空格分开的整数,表示 X 进制数 B 按从高位到低位顺序各

个数位上的数字在十进制下的表示。

请注意,输入中的所有数字都是十进制的。

【输出格式】

输出一行一个整数,表示 X 进制数 A ? B 的结果的最小可能值转换为十进

制后再模 1000000007 的结果。

试题E: X进制减法 

6第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组

【样例输入】

11

3

10 4 0

3

1 2 0

【样例输出】

94

 

#include

#include

int max(int a,int b){

    if(a>=b&&a>2){

        return a+1;

    }

    else if(b>2&&b>a){

        return b+1;

    }

    else{

        return 2;

    }

}

char a[20];

char b[20];

char m[20];

int main(){

int n,ma,mb,i,jg,sum,sum1,m1,m2,j;

int s[20]={1,1,1,1,1};

m1=1;

m2=1;

sum=0;

sum1=0;

scanf(“%d”,&n);

scanf(“%d”,&ma);

for(i=0;i

    scanf(“%d”,&a[i]);

    }

scanf(“%d”,&mb); 

for(i=0;i

    scanf(“%d”,&b[i]);

    }

for(i=0;i

    m[i]=max(a[i],b[i]);

//printf(“%dn”,m[i]);

}

for(i=0;i

    for(j=i+1;j

    s[i]*=m[j];

    }

}

for(i=0;i

    sum+=(a[i]*s[i]);

    sum1+=(b[i]*s[i]);

}

jg=sum-sum1;

printf(“%d”,jg);

return 0;

}

这道题我感觉我写的复杂了,可能时间复杂度会高些。

题目要求我们找到最小的A-B最小的结果,根据X进制要求我们只需要找到A和B相同位数的最大值即可,注意不能小于2,然后相乘即可。

试题 F: 统计子矩阵

时间限制: 1.0s 

内存限制: 256.0MB 

本题总分:15 分

【问题描述】

给定一个 N × M 的矩阵 A,请你统计有多少个子矩阵 (最小 1 × 1,最大

N × M) 满足子矩阵中所有数的和不超过给定的整数 Kp>

【输入格式】

第一行包含三个整数 N, M 和 K.

之后 N 行每行包含 M 个整数,代表矩阵 A.

【输出格式】

一个整数代表答案。

【样例输入】

3 4 10

1 2 3 4

5 6 7 8

9 10 11 12

【样例输出】

19

【样例说明】

满足条件的子矩阵一共有 19,包含:

大小为 1 × 1 的有 10 个。

大小为 1 × 2 的有 3 个。

试题 F: 统计子矩阵 

8第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组

大小为 1 × 3 的有 2 个。

大小为 1 × 4 的有 1 个。

大小为 2 × 1 的有 3 个

 

 

#include

char s[20][20];

int main(){

int m,n,k,sum,ans,i,j,w,q,ans1,ans2;

ans1=0;

sum=0;

ans=0;

ans2=0;

scanf(“%d%d%d”,&m,&n,&k);

for(i=0;i

for(j=0;j

scanf(“%d”,&s[i][j]);

        }

    }

for(i=0;i

for(j=0;j

//sum=0;

for(w=i;w

    sum=0;

for(q=j;q

sum+=s[w][q];

if(sum

    ans++;

            }

        }

    }

} break;

}

for(j=0;j

for(i=0;i

//sum=0;

for(q=j;q

    sum=0;

for(w=i;w

    sum+=s[w][q];

    if(sum

        ans1++;

                }

            }

        }

    } break;

}

for(i=0;i

for(j=0;j

if(s[i][j]

        ans2++;

        }

    }

}

printf(“%d”,ans+ans1-ans2);

return 0;

}

 

这道题有点难,考试就不会了,(我实属菜鸡)现在写出来的也不知道能不能在规定时间跑出来。

主要要注意sum=0的位置。

 

 

 

 

 

试题 G: 积木画

时间限制: 1.0s 

内存限制: 256.0MB 

本题总分:20 分

【问题描述】

小明最近迷上了积木画,有这么两种类型的积木,分别为 I 型(大小为 2

个单位面积)和 L 型(大小为 3 个单位面积):

同时,小明有一块面积大小为 2 × N 的画布,画布由 2 × N 个 1 × 1 区域构

成。小明需要用以上两种积木将画布拼满,他想知道总共有多少种不同的方式p>

积木可以任意旋转,且画布的方向固定。

【输入格式】

输入一个整数 N,表示画布大小。

【输出格式】

输出一个整数表示答案。由于答案可能很大,所以输出其对 1000000007 取

模后的值

#include

int maxn=10000;

long mod=1000000007;

int main(){

int i,n;

char f[maxn];

char g[maxn];

f[0]=1;

f[1]=1;

f[2]=2;

g[0]=0;

g[1]=1;

//char f[maxn];

//char g[maxn];

scanf(“%d”,&n);

for(i=2;i

    f[i]=f[i-1]%mod+f[i-2]%mod+2*g[i-2]%mod;

    g[i]=f[i-1]%mod+g[i-1]%mod;

}

printf(“%d”,f[n]);

return 0;

}

这题代码量少了很多,但是我感觉这个dp 动态规划还是很难的,后来看了其他大佬的写法才慢慢想明白(属实不易)这题难就难在三个角的形状怎么弄,后来又听说洛谷有差不多的题还是原题。

 

试题 H: 扫雷

时间限制: 1.0s 

内存限制: 256.0MB 

本题总分:20 分

【问题描述】

小明最近迷上了一款名为《扫雷》的游戏。其中有一个关卡的任务如下,

在一个二维平面上放置着 n 个炸雷,第 i 个炸雷 (xi, yi,ri) 表示在坐标 (xi, yi) 处

存在一个炸雷,它的爆炸范围是以半径为 ri 的一个圆。

为了顺利通过这片土地,需要玩家进行排雷。玩家可以发射 m 个排雷火

箭,小明已经规划好了每个排雷火箭的发射方向,第 j 个排雷火箭 (xj, yj,rj) 表

示这个排雷火箭将会在 (xj, yj) 处爆炸,它的爆炸范围是以半径为 rj 的一个圆,

在其爆炸范围内的炸雷会被引爆。同时,当炸雷被引爆时,在其爆炸范围内的

炸雷也会被引爆。现在小明想知道他这次共引爆了几颗炸雷p>

你可以把炸雷和排雷火箭都视为平面上的一个点。一个点处可以存在多个

炸雷和排雷火箭。当炸雷位于爆炸范围的边界上时也会被引爆。

【输入格式】

输入的第一行包含两个整数 n、m.

接下来的 n 行,每行三个整数 xi, yi,ri,表示一个炸雷的信息。

再接下来的 m 行,每行三个整数 xj, yj,rj,表示一个排雷火箭的信息。

【输出格式】

输出一个整数表示答案

 

#include

#include

int res=0;

int n;

struct boom{

double x;//n雷m火箭 

double y;

double r;

int k;

}a[10086];

int xiu(int x,int y,int r){

int i;

for(i=0;i

if(pow(a[i].x-x,2)+pow(a[i].y-y,2)

      res++;

      a[i].k=1;

      xiu(a[i].x,a[i].y,a[i].r);

         }

    }

}

int main(){

int m,i,x,y,r;

scanf(“%d%d”,&n,&m);

for(i=0;i

        scanf(“%lf%lf%lf”,&a[i].x,&a[i].y,&a[i].r);

        a[i].k=0;

        }

for(i=0;i

        scanf(“%d%d%d”,&x,&y,&r);

        xiu(x,y,r);

}

printf(“%d”,res);

return 0;

}

这道题巧用递归

 

 

试题 I: 李白打酒加强版

时间限制: 1.0s 

内存限制: 256.0MB 

本题总分:25 分

【问题描述】

话说大诗人李白,一生好饮。幸好他从不开车。

一天,他提着酒壶,从家里出来,酒壶中有酒 2 斗。他边走边唱:

无事街上走,提壶去打酒。

逢店加一倍,遇花喝一斗。

这一路上,他一共遇到店 N 次,遇到花 M 次。已知最后一次遇到的是花,

他正好把酒喝光了。

请你计算李白这一路遇到店和花的顺序,有多少种不同的可能p>

注意:壶里没酒 ( 0 斗) 时遇店是合法的,加倍后还是没酒;但是没酒时遇

花是不合法的。

【输入格式】

第一行包含两个整数 N 和 M.

【输出格式】

输出一个整数表示答案。由于答案可能很大,输出模 1000000007 的结果。

 

#include

int ans=0;

long long e=10e9+7;

int main(){

    int n,m;//n*2,m-1

    scanf(“%d%d”,&n,&m);

    fun(2,n,m-1);

    printf(“%d”,ans%e);

    return 0;

void fun(int x,int n,int m){

        if(x==1&&n==0&&m==0)

        {

            ans++;

        }

        if(n>0)

        {

            fun(x*2,n-1,m);

        }

        if(m>0)

        {

            fun(x-1,n,m-1);

        }

    }

接着递归 ,参照其他大佬的(菜鸡属实不易)

 

 

 

试题 J: 砍竹子

时间限制: 1.0s 

内存限制: 256.0MB 

本题总分:25 分

【问题描述】

这天,小明在砍竹子,他面前有 n 棵竹子排成一排,一开始第 i 棵竹子的

高度为 hi.

他觉得一棵一棵砍太慢了,决定使用魔法来砍竹子。魔法可以对连续的一

段相同高度的竹子使用,假设这一段竹子的高度为 

H,那么使用一次魔法可以

把这一段竹子的高度都变为 ? √? H

2 ? + 1?,其中 ?x? 表示对 

向下取整。小明想

知道他最少使用多少次魔法可以让所有的竹子的高度都变为 

1

 

 

这题我觉得应该还是先用几个数组来找到连续一段相同的,太难了。

文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览35161 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年3月15日
下一篇 2022年3月15日

相关推荐