又是一年一度的蓝桥杯了,本届蓝桥杯的题型分布有所改变,如果没记错的话往常都是3-5道填空题,今年一反往常只有2道填空题了,相对于之前的“暴力破解杯”和“dp杯”,现在的蓝桥杯阅读难度有所降低,数学知识和贪心的题目也多了起来。
第一题:试题A: 九进制转十进制
题解:最近几年的打卡题都偏向于计算机基础知识了,这题如果是科班出身的话在计算机组成原理的课程中应该有学习到进制转换的知识,93*2+92*0+90*2=1478
#include <bits/stdc++.h>
using namespace std;
int main()
{
cout<<9*9*9*2+9*2+1*2;
return 0;
}
运行结果
第二题:试题B: 顺子日期
题解:题目好像有歧义,题目中说20221023不算顺子,但是里面又含有210,那么到底是逆序不算顺子还是含0不算顺子呢。由题解中的解释:顺子就是连续的三个数字,所以递增递减都应该算作顺子,所以2022年01月20日到2022年01月29日(不确定)、2022年03月21日,2022年02月10日(不确定),2022年10月12日(不确定)2022年11月23,2022年12月10日(不确定),2022年12月30日,2022年12月31日,一共4种?。
第三题:试题C: 刷题统计
题解:一看数据规模n<=1018,这在往常的蓝桥杯里比较少见,第三题就开始卡时间了,直接模拟的话只能拿一半的分,所以可以采用数学方法来解,先算一周能做多少工作,在计算总共需求多少周,然后在讨论剩下的部分
#include <bits/stdc++.h>
using namespace std;
int main()
{
//注意题目中的数据规模,明显数据范围是大于int的最大值
//如果这里使用int的话,就算想到了用数学方法解也会因为接收不到n导致错误
long long a,b,n;
cin>>a>>b>>n;
int totalday;
//先计算一周能做多少题目
int weekjob=a*5+b*2;
//一共需要多少周
int week=n/weekjob;
//剩余的题目
double dayjob=n%weekjob;
if(dayjob<=5*a){
totalday=week*7+ceil(dayjob/a);//向上取整
}else{
//如果剩余的工作周一到周五做不完则周六周日做
totalday=week*7+5+ceil((dayjob-5*a)/b);
}
cout<<totalday;
return 0;
}
第四题:试题D: 修剪灌木
题解:老规矩先看数据规模n<=10000,所以来说正常用模拟的方法不会超时,除了模拟以外还可以找规律贪心很容易可以知道树的最大高度=max((i-1)*2,(n-i)*2);然后树的最大高度是对称的。
解法一(贪心):
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cout<<max((i-1)*2,(n-i)*2)<<endl;
}
解法二(模拟):
#include <bits/stdc++.h>
using namespace std;
void all_tree_grow_up(vector<int> &trees,vector<int> &res,int k){
for(int i=1;i<trees.size();i++){
if(i==k)