2022年蓝桥杯省赛真题解析(C++B组)

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

            2022.04.09,我第一次参加蓝桥杯,我想说今年官方为了防止作弊,可谓煞费苦心,直接启用备用卷,难度直接到国赛难度。第一次参加,却让我输的那么彻底。

    目录

    A九进制转十进制​

    B 顺子日期

    C 刷题统计

    D 修剪灌木

    E X进制减法

    F 统计子矩阵

    G 积木画 

    H 扫雷

    I 李白打酒加强版

    J 砍竹子


    A九进制转十进制

    答案:1478

    B 顺子日期

    答案:4 / 14

    解析:我填了4,当时我一直在想012算不算,题目说了20220123有一个顺子:123,没说是012,所以我认定它不算,那就只有20220123,20221123,20221230,20221231。注意:降序是不算顺子的。

    C 刷题统计

    for(50分吧)

    #include <bits/stdc++.h>
    #define MOD 1000000007
    using namespace std;
    typedef long long LL;
    LL a,b,n;
    int main() {
    	int sum=0;
    	cin>>a>>b>>n;
    	for(LL i=1; ;i++) {
    		if(i%7!=6 && i%7!=0) sum+=a;
    		else sum+=b;
    		if(sum>=n) {
    			cout<<i;
    			return 0;
    		}
    	}
    	return 0;
    }

    优化(应该100)

    #include <bits/stdc++.h>
    #define MOD 1000000007
    using namespace std;
    typedef long long LL;
    LL a,b,n;
    int main() {
    	cin>>a>>b>>n;
    	LL sum=a*5+b*2;//一周的做题数
    	LL t=n/sum;//需要t周(往下取整)
    	LL nn=t*sum;//t周做了nn个题目
    	if(nn>=n) cout<<t*7;
    	else if(nn+a>=n) cout<<t*7+1;
    	else if(nn+a*2>=n) cout<<t*7+2;
    	else if(nn+a*3>=n) cout<<t*7+3;
    	else if(nn+a*4>=n) cout<<t*7+4;
    	else if(nn+a*5>=n) cout<<t*7+5;
    	else if(nn+a*5+b>=n) cout<<t*7+6;
    	else if(nn+a*5+b*2>=n) cout<<t*7+7;//考试时没写这句,刚刚试数据查到错的....彻底无语,大无语事件
    	return 0;
    }

    D 修剪灌木

     解析:我是直接用草稿纸手推出来,发现的规律,1需要特判:1。2输出2 2,3输出4 2 4,4输出6 4 4 6,5输出8 6 4 6 8……以此类推就好了,我们看到边界是最高的,然后往中间成以公差为-2递减。所以用双指针控制它即可

    #include <bits/stdc++.h>
    #define MOD 1000000007
    using namespace std;
    typedef long long LL;
    int a[10005];
    int n;
    int main() {
    	cin>>n;
    	if(n==1) {
    		cout<<1;
    		return 0;
    	}
    	int s=(n-1)*2;
    	int l=1,r=n;
    	while(l<=r) {
    		a[l]=a[r]=s;
    		l++,r--;
    		s-=2;
    	}
    	for(int i=1; i<=n; i++)
    		cout<<a[i]<<endl;
    	return 0;
    }

    E X进制减法

            我在考场上看到好多人卡这题,主要是读不懂题,出考场时有很多人问我321怎么等于65,题目说了三个位的进制分别是8 10 2(从左到右),所以就是3 * 20 + 2 * 2 + 1 = 65,看不懂的小伙伴可以回去好好复习一下二进制或者往下看。

    解析:

            321的“1”是2进制,逢2进1,即“2”就意味着数字4=2*2,“2”的进制是10进制,逢10进1,也就是说对于“2”来说,“3”代表着30,而对于“1”来说“3”则代表着60=30*2。通俗的说,假如321整个树是10进制,那么对于“2”而言“3”是30,对于“1”而言,“3”是300=3*10*10.

            然后,这里的最高位进制是没用的,相当于摆设。由于它说a b同一条进制系统,所以数位的进制应该是一样的,那么我们就需要一个s数组来存放当前数位应该*哪个数了

    #include <bits/stdc++.h>
    #define MOD 1000000007
    using namespace std;
    typedef long long LL;
    int n,ma,mb;
    LL sum,s1,s2,a[100015],b[100015],s[100015];
    int main() {
    	cin>>n;
    	cin>>ma;
    	for(int i=1; i<=ma; i++)
    		cin>>a[i];
    	cin>>mb;
    	for(int i=ma-mb+1; i<=ma; i++)//B<=A
    		cin>>b[i];
    	
    	s[ma]=1,s[ma-1]=2;//最低位固定二进制,即*1,那么前一位就*2
    	for(int i=ma-2; i>0; i--) {
    		s[i]=(max(a[i+1],b[i+1])+1)%MOD;//贪心,数位上的两个数取大的+1即为当前数位的进制(这里直接存放当前数位转成10进制该*的数)
    		s[i]=(s[i]%MOD)*(s[i+1]%MOD);//取模防爆
    	}
    	for(int i=1; i<=ma; i++) {
    		s1=(s1+(s[i]%MOD)*(a[i]%MOD))%MOD;//累加
    		s2=(s2+(s[i]%MOD)*(b[i]%MOD))%MOD;
    	}
    	cout<<(s1-s2)%MOD;
    	
    	return 0;
    }

    F 统计子矩阵

    二维前缀和,不会。。。

    G 积木画 

    听他们说这道题在洛谷有原题,而且是用dp做,完全和他们不一样,我用斐波那契做的 

    解析:

            这题我依旧是手推找规律。

            n为1时是1 = 1 + 0 * 2;

            n为2时是2 = 2 + 0 * 2;

            n为3时是5 = 3 + 1 * 2;

            n为4时是9 = 5 + 2 * 2;

            n为5时是18 = 8 + 5 * 2;

            n为6时是35 = 13 + 12 * 2;

            n为7时是67 = 21 + 23 * 2;以此类推

            我们发现前面的(只有I形)是斐波那契数列,后面的(有L和I型)是一个有规律的数列吧,我也不知道啥数列:2 + 3 = 5,5 + 6 = 11,11 + 12 = 23

            我也不知道对不对,没管后面了,直接编程交了,然后看了一下洛谷的,发现错了。

            代码就不给了,这个是错误思路,正解请移步洛谷P1990

    H 扫雷

     

     这个我好像用两个for,不知道能不能骗分,听一个小伙伴说是0分,那太好了,又错了.......

    I 李白打酒加强版

    dfs能骗分,考的时候没想出来 

    J 砍竹子

     不会....

    这次顶死40分,没省二咯,该退役咯~~~

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
    标签: C++