前言
博主忙活一天有点累先鸽掉一天算法,先更新一次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记录二次方的前缀和
(二分 + 前缀和 + 排序 )
二分模板
没啥好讲的模板,上次博客用的就是这套,
注意别对原数组进行改变了 新开一个数组
排序 + 前缀和 + 方差
注意返回条件
。
我的任务完成辣!
明天可能会更新后三道题,也不一定,因为大雾又要考试了 ******质点动力学 比 质点运动学更难。。。
算法再鸽掉几天(