2020年蓝桥杯B组个人题解(热的,不知道对错)

文章目录


现在是蓝桥杯刚结束,趁着有记忆,写下这篇博客,不知道对错,如果我错了,请指出。

A

因为是到0就结束了,那么每次看看-600是否结束,如果没有结束就+300.然后时间+2*60
最后时间再加上剩下的能量/10
所以我的答案是3880

B

首先计算1921年的剩下时间+2020年度过的时间,最后再for一遍加上中间的每年的时间。
还有办法就是用计算器…它里面有算日期的功能,最终答案是52038720

C

我这个是按照最坏情况来算的,应该是100/10+10是最小的,所以我的答案是10。
但是我这里有人是按照概率去算的,他的答案是11,我不清楚哪个是对的,因为我懒得看。

D

这道题,所有的数字不超过一位。
然后我用getilne读入,查看每次前面的空格有几个,然后用一个栈维护现在到的层数以及循环次数。
最终答案应该是241830

E

这道题我已经知道自己找了个错的规律,跟别人交流了一下。
使用dp,dp[i][j]表示第一行的长度是i,第二行的长度是j,然后枚举新进来的数进行转移
答案应该是1340

F

让你输出除二的序列
这道题,注意使用longlong即可。

G

解码
那么直接for一遍,查看i+1是否是数字,然后循环输出,注意到最后一个字符特判一下。

H

从1,1走到n,m
那么状态转移方程应该是

dp[1][1]=1;
for(int i=1;i<=n;i++){
     for(int j=1;j<=m;j++){
         if(i==1&&j==1)continue;
         if(i%2==0&&j%2==0)continue;
         dp[i][j]=dp[i-1][j]+dp[i][j-1];
     }    
 }

I

查看两个数合并是否是k的倍数
首先用unordered_map保存每个数 10 100 1000.... *10,*100,*1000.... 直到 1 0 9 % k *10^9\%k 之后的计数。
然后枚举每个数作为后面的情况,注意如果它本身也可以的话要-1.

J

每次有2个操作,要么连边,要么将一个连通块的所有点的值+t。
压轴题可能只有cf上2200左右的水平,那么解法也是比较容易理解的。
首先考虑并查集,这个显然是一道并查集的题目,我考虑过可持久化并查集,但是有点忘了它是干嘛的,于是就从其它地方下手。
首先考虑加值,我们肯定是将每次添加的值放到这个连通块的根上,然后最后做一遍dfs将值向下传递。
那么合并的时候我们就不能将存在的点作为根,因为这个点原来所在的并查集中还有值未向下传递。于是我们对于每次合并两个不同连通块的时候建一个虚点:
在这里插入图片描述
然后以虚点作为根,这样就可以避免值传递错误的问题。

#include<iostream>
using namespace std;
int main(){
	cout<<"没有代码,懒得写"<<endl;
}

总结

第一次参加蓝桥杯,比预想中简单,甚至比模拟赛简单,最后一题的难度超过了模拟赛的难度,但是暴力能拿0.7的分,所以区别不大。
但是其中有很多需要人细心的地方,因为我也是第一次参加OI赛制,最终的对错是看不见的,那么就考验选手自己发现问题的能力了。我也是在检验当中发现了很多的问题,比如说D题,我实在检查的时候看到了“怎么还有一个文件,这是哪道题的?”然后才发现D题不仅仅是题目中的那么一点点。
其它就没什么感想了,至于程序设计题我思路应该没有问题,就是不知道细节怎么样。
听天由命吧。

结果

拿了个省一,不知道国赛什么情况,其实不是很想去参加没啥用。

猜你喜欢

转载自blog.csdn.net/tianyizhicheng/article/details/107137951