蓝桥杯竞赛向(C/C++语言)之真题讲解(上)


前言

博主忙活一天有点累先鸽掉一天算法,先更新一次15届蓝桥杯真题的讲解吧(A组)
一道填空 + 六道编程(本次先讲解一道填空 + 三道编程)
后几道较长也需要好好讲讲 就分两次了


一、五子棋对弈

链接:蓝桥平台

在这里插入图片描述
很容易想到的思路就是遍历所有的情况,对于每种情况进行判断,只要有一方赢就
return 0,没有return 就 return 1;(枚举 + DFS + 模拟)
可以加入一点剪枝(因为是白棋先手 所以最后的结果一定是白棋13个,黑棋12个)不符合直接return就好了
不加也无所谓,选择题你让他去跑往下做就完了,并且时间也不长。
平局的代码是很好写的,暴力枚举每一行 && 每一列 && 主对角线 && 副对角线即可

int win()
{
    for (int i = 1; i <= 5; i++)
    {
        if (mp[i][1] == 1 && mp[i][2] == 1 && mp[i][3] == 1 && mp[i][4] == 1 && mp[i][5] == 1) return 0;
        if (mp[i][1] == -1 && mp[i][2] == -1 && mp[i][3] == -1 && mp[i][4] == -1 && mp[i][5] == -1) return 0;
    } 
    for (int i = 1; i <= 5; i++)
    {
        if (mp[1][i] == 1 && mp[2][i] == 1 && mp[3][i] == 1 && mp[4][i] == 1 && mp[5][i] == 1) return 0;
        if (mp[1][i] == -1 && mp[2][i] == -1 && mp[3][i] == -1 && mp[4][i] == -1 && mp[5][i] == -1) return 0;
    }
    if (mp[1][1] == 1 && mp[2][2] == 1 && mp[3][3] == 1 && mp[4][4] == 1 && mp[5][5] == 1) return 0;
    if (mp[1][1] == -1 && mp[2][2] == -1 && mp[3][3] == -1 && mp[4][4] == -1 && mp[5][5] == -1) return 0;
    if (mp[1][5] == 1 && mp[2][4] == 1 && mp[3][3] == 1 && mp[4][2] == 1 && mp[5][1] == 1) return 0;
    if (mp[1][5] == -1 && mp[2][4] == -1 && mp[3][3] == -1 && mp[4][2] == -1 && mp[5][1] == -1) return 0;
    return 1;
}

重点是在DFS 如何填满所有`普通五子棋dfs跑满只需要int dfs(int sum)即可,因为要剪枝,所以传入个black 和 white 代表个数
坐标(x,y)通过sum求得,直接跑黑白就行

int dfs(int sum, int black, int white)
{
    if (black > 12 || white > 13) return 0;
    if (sum == 25) return win(); 
    int x = sum / 5 + 1, y = sum % 5 + 1;
    int res = 0;
    mp[x][y] = 1;//白
   res += dfs(sum + 1, black, white + 1);
    mp[x][y] = -1;
   res += dfs(sum + 1, black + 1, white);
    return res;
}

完整代码 ? 啥都给你了你还想要啥

二、训练士兵

链接:蓝桥平台
在这里插入图片描述
组团花S 所有士兵一次训练的和假设为sum,很容易想到,只要sum > S就要组团花费 训练几次后,有的人训练完毕,是不还是要比剩下所有人的和于S的大小,容易想到,按训练次数从小到大排序,只要sum 比 S大就组团,否则直接break,统计剩下的钱数,有思路就不难做题了
(排序 + 贪心)
在这里插入图片描述
注意:本题可以自定义一个结构体,也可以使用pair,对pair进行sort是按first升序,相同时second升序来排序的 道理类似

三、团建

链接:蓝桥平台
在这里插入图片描述
读完题,心里想的就应该是树上的DFS,找前缀相同即可
(建树 + DFS)
在这里插入图片描述
这里不swap也可以,swap了就是更直观一点;让1 -> 2 而不是 2 -> 1
注意别ma[x].push_back(y),ma[y].push_back(x),这样要去判断是否走到了他爹的结点,否则就成环了,就爆内存辣

四、成绩统计

链接:蓝桥平台
在这里插入图片描述
这个破题在博主上一期提到了,确实很ex,tnnd还得用到高中知识,我****
不扯了,来根据题分析思路
看到至少想到二分 人越多越容易选出k个
选出k个人使得方差小于固定值T,方差反应了一组数的变化程度,越接近方差越小,又看到选出k个人不要求顺序,想到对他们进行排序
整体流程 :二分模板 + 排序 + 求方差
方差怎么求? 用那个公式?包超时的啊,回忆高中 有一句话叫做 方差 等于 平方的期望 - 期望的平方,wc,这不是前缀和吗
prefix1记录一次方的前缀和,prefix2记录二次方的前缀和
(二分 + 前缀和 + 排序 )
二分模板
在这里插入图片描述
没啥好讲的模板,上次博客用的就是这套,
在这里插入图片描述
注意别对原数组进行改变了 新开一个数组
排序 + 前缀和 + 方差
注意返回条件

我的任务完成辣!
明天可能会更新后三道题,也不一定,因为大雾又要考试了 ******质点动力学 比 质点运动学更难。。。
算法再鸽掉几天(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值