2018 蓝桥杯省赛 B 组模拟赛(五)

计蒜客蓝桥杯省赛 B 组模拟赛网址  https://www.jisuanke.com/contest/1215
A题:矩阵求和
给你一个从 n×n 的矩阵,里面填充 11 到 n×n 。例如当 nn 等于 33 的时候,填充的矩阵如下。
1 2 3
4 5 6
7 8 9
现在我们把矩阵中的每条边的中点连起来,这样形成了一个新的矩形,请你计算一下这个新的矩形的覆盖的数字的和。比如,n = 3n=3 的时候矩形覆盖的数字如下。
  2
4 5 6
  8
那么当 nn 等于 101101 的时候,矩阵和是多少?
题意就是求正方形四条边中点连接起来形成的新正方形里面所有数的和 ,用等差数列列公式求,或者循环一个一个求,最后答案是26020201

B题:素素个数
用  0,1,2,3⋯7 这 8 个数组成的所有整数中,质数有多少个(每个数字必须用到且只能用一次)。
提示:以 00 开始的数字是非法数字。

当初看这个题的时候看成0到8了 求出来质数只有0个,(0加到8是三的倍数)。后来发现题读错了,,,

求一下0到7的全排列,再判断这个数是不是素素就行了。。代码忘记保存了 最后答案是2668。

C题:

连连看是一款非常有意思的游戏。

我们可以把任意两个在图的在边界上的相同的方格一起消掉,比如把两个4消掉以后,

每次消掉两个方格的时候,都有会获得一个分数,第 i次消的分数为 i× 方格的值。比如上面的消法,是第一次消,获得的分数为 1×4=4。
请你帮忙最优操作情况下,获得的分数最多为多少。
这个题我是手算的,目的就是先把值小的数消掉,当然最开始和他们的想法一样 消掉(1,1)和(2,4)这两个一。但是这样还剩下两个(2,2)和(3,2)这两个一就至少要第四轮才能被消掉。 (想一想这个题作者就是想要让大家是先消一进坑)。然后我就从2开始消了,下面是我的消法(2,1)(1,3)->(1,1)和(2,2)  (3,2)和(2,4)。。后面的消法就基本一样了。。
最后答案是89

D题:快速幂
没有循环,那很明显是用递归实现。
#include <stdio.h>

int pw(int x, int y, int p) {
    if (!y) {
        return 1;
    }
    int res = pw(x*x,y>>1,p);
    if (y & 1) {
        res = res * x % p;
    }
    return res;
}
int main() {
    int x, y, p;
    scanf("%d%d%d", &x, &y, &p);
    printf("%d\n", pw(x, y, p));
    return 0;
}


E题:末尾零的个数

N! 末尾有多少个 000 呢?

N!=1×2×⋯×NN! = 1 \times 2 \times \cdots \times NN!=1×2××N

代码框中的代码是一种实现,请分析并填写缺失的代码。

只需要找到N的阶乘里面有多少个因子5,也就是能被多少个5整除。2和5组成10,2的因子一定比5的因子多。



#include <stdio.h>
int main() {
    int n, ans = 0;
    scanf("%d", &n);
    while (n) {
        ans += (n=n/5);
    }
    printf("%d\n", ans);
    return 0;
}

F题:藏宝图


蒜头君得到一张藏宝图。藏宝图是一个 10×1010 \times 1010×10 的方格地图,图上一共有 101010 个宝藏。有些方格地形太凶险,不能进入。

整个图只有一个地方可以出入,即是入口也是出口。蒜头君是一个贪心的人,他规划要获得所有宝藏以后才从出口离开。

藏宝图上从一个方格到相邻的上下左右的方格需要 111 天的时间,蒜头君从入口出发,找到所有宝藏以后,回到出口,最少需要多少天。
这个题我用手画的,然后再用手数,,,,,,,,
答案是48


不想写了 。。。。。。。有毒。。写到一半就崩溃,,没来得及保存。。恢复网页上面都没有了。。。


G:栈的模拟
 
            
#include <stdio.h>
#include <math.h>
int main() {
    int aa[500100];
    int head=1,cnt=0,x,n;
    scanf("%d",&n);
    scanf("%d",&aa[1]);
    for(int i=2;i<=n;i++)
    {
        head++;
        scanf("%d",&aa[head]);
        while(1)
        {
            if(head==1)
            {
                break;
            }
            else if(aa[head]-aa[head-1]==1)
            {
                cnt++;
                head--;
                ///printf("head=%d %d\n",head,aa[head]);
            }
            else if(aa[head-1]-aa[head]==1)
            {
                cnt++;
                head--;
                aa[head]=aa[head+1];
            }

            else
            {
                break;
            }
        }
    }
    printf("%d\n",cnt);
    return 0;
}
H:蒜头君下棋

蒜头君喜欢下棋。最近它迷上了国际象棋。国际象棋的棋盘可以被当做一个 8×88\times 88×8 的矩阵,棋子被放在格子里面(不是和中国象棋一样放在线上)。

蒜头君特别喜欢国际象棋里面的马,马的移动规则是这样的:横着走两步之后竖着走一步,或者横着走一步之后竖着走两步。例如,一匹马在 (3,3)(3,3)(3,3) 的位置,则它可以到达的地方有 (1,2)(1,2)(1,2)(2,1)(2,1)(2,1)(1,4)(1,4)(1,4)(4,1)(4,1)(4,1)(5,2)(5,2)(5,2)(2,5)(2,5)(2,5)(5,4)(5,4)(5,4)(4,5)(4,5)(4,5) 八个地方。蒜头君想要把整个棋盘都放上马,并且让这些马不能相互攻击(即任何一匹马不能走一步之后就到达另一匹马的位置)。蒜头君当然知道在 8×88 \times 88×8 的棋盘上怎么放马,但如果棋盘变为 n×mn \times mn×m 的,蒜头君就不懂了。他希望你来帮忙他计算一下究竟能放多少匹马。

输入格式

共一行,两个整数nnnmmm(1≤n,m≤1000 1 \leq n , m \leq 10001n,m1000),代表棋盘一共有 nnnmmm 列。

输出格式

输出一个整数,代表棋盘上最多能放的马的数量。

样例输入1
2 4
样例输出1
4
样例输入2
3 4
样例输出2
6
#include <stdio.h>
#include <math.h>
int main() {
    int aa[500100];
    int head=1,cnt=0,x,n;
    scanf("%d",&n);
    scanf("%d",&aa[1]);
    for(int i=2;i<=n;i++)
    {
        head++;
        scanf("%d",&aa[head]);
        while(1)
        {
            if(head==1)
            {
                break;
            }
            else if(aa[head]-aa[head-1]==1)
            {
                cnt++;
                head--;
                ///printf("head=%d %d\n",head,aa[head]);
            }
            else if(aa[head-1]-aa[head]==1)
            {
                cnt++;
                head--;
                aa[head]=aa[head+1];
            }

            else
            {
                break;
            }
        }
    }
    printf("%d\n",cnt);
    return 0;
}

n和m其中一个等于2的最优放置方法
n和m都大于2的最优放置方法

I题:蒜头君的数轴

今天蒜头君拿到了一个数轴,上边有 nnn 个点,但是蒜头君嫌这根数轴不够优美,想要通过加一些点让它变优美,所谓优美是指考虑相邻两个点的距离,最多只有一对点的距离与其它的不同。

蒜头君想知道,他最少需要加多少个点使这个数轴变优美。

输入格式

输入第一行为一个整数 n(1≤n≤105)n(1 \leq n \leq 10^5)n(1n105),表示数轴上的点数。

第二行为 nnn 个不重复的整数 x1,x2,...,xn(−109≤xi≤109)x_1,x_2,...,x_n(-10^9 \leq x_i \leq 10^9)x1,x2,...,xn(109xi109),表示这些点的坐标,点坐标乱序排列。

输出格式

输出一行,为一个整数,表示蒜头君最少需要加多少个点使这个数轴变优美。

样例输入
4
1 3 7 15
样例输出
1

哎,,,这个题,我不会。。。。

J题:整数划分

蒜头君特别喜欢数学。今天,蒜头君突发奇想:如果想要把一个正整数 nnn 分解成不多于 kkk 个正整数相加的形式,那么一共有多少种分解的方式呢?

蒜头君觉得这个问题实在是太难了,于是他想让你帮帮忙。

输入格式

共一行,包含两个整数 n(1≤n≤300)n(1 \leq n \leq 300)n(1n300)k(1≤k≤300)k(1 \leq k \leq 300)k(1k300),含义如题意所示。

输出格式

一个数字,代表所求的方案数。

样例输入
5 3
样例输出
5
这是一个dp题,我手写了好多组找出来的规律,而且这个题int是过不了的
#include <stdio.h>
int main()
{
    long long  dp[350][350];
    dp[0][0]=1;
    for(int i=1;i<=300;i++)
        dp[i][1]=1;
    for(int i=2;i<=300;i++)
    {
        for(int j=2;j<=i;j++)
        {
            dp[i][j]=dp[i][j-1];
            if(j>i-j)
                dp[i][j]+=dp[i-j][i-j];
            else
                dp[i][j]+=dp[i-j][j];
        }
    }
    long long  n,m;
    scanf("%lld%lld",&n,&m);
    if(m>n)
        m=n;
    printf("%lld\n",dp[n][m]);
    return 0;
}



     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值