精华内容
下载资源
问答
  • 第十二届蓝桥杯国赛

    2021-06-05 16:50:40
    刚进行完第十二届蓝桥杯国赛,说一下题目感想。 这次是四道填空题,六道代码题,感觉这次出的题还比较对路,不像原来很难做出来,但是也有粗心做错的题,算法前面考的到不多,后面大题考的多,动态规划,深搜等,过...

    刚进行完第十二届蓝桥杯国赛,说一下题目感想。
    这次是四道填空题,六道代码题,感觉这次出的题还比较对路,不像原来很难做出来,但是也有粗心做错的题,算法前面考的到不多,后面大题考的多,动态规划,深搜等,过几天出成绩,希望成绩可以稍微喜人点。
    第一题:(签到题吧)
    问八位二进制可以表示的最大数是多少。
    第二题:
    试题 A: 纯质数
    ****(在议论零)****
    本题总分:5 分
    【问题描述】
    如果一个正整数只有 1 和它本身两个约数,则称为一个质数(又称素数)。
    前几个质数是:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, · · · 。
    如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2,
    3, 5, 7, 23, 37 都是纯质数,而 11, 13, 17, 19, 29, 31 不是纯质数。当然 1, 4, 35
    也不是纯质数。
    请问,在 1 到 20210605 中,有多少个纯质数?
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
    个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
    第三题:
    试题 B: 完全日期

    使用Calendar date 依次遍历,之后check;

    本题总分:5 分
    【问题描述】
    如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日
    期。
    例如:2021 年 6 月 5 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 16,而
    16 是一个完全平方数,它是 4 的平方。所以 2021 年 6 月 5 日是一个完全日期。
    例如:2021 年 6 月 23 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16,
    是一个完全平方数。所以 2021 年 6 月 23 日也是一个完全日期。
    请问,从 2001 年 1 月 1 日到 2021 年 12 月 31 日中,一共有多少个完全日
    期?
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
    个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
    第四题:
    试题 C: 最小权值

    本题总分:10 分
    【问题描述】
    对于一棵有根二叉树 T,小蓝定义这棵树中结点的权值 W(T) 如下:
    空子树的权值为 0。
    如果一个结点 v 有左子树 L, 右子树 R,分别有 C(L) 和 C® 个结点,则
    W(v) = 1 + 2W(L) + 3W® + (C(L))
    2 C®。
    树的权值定义为树的根结点的权值。
    小蓝想知道,对于一棵有 2021 个结点的二叉树,树的权值最小可能是多
    少?
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
    个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
    第五题:
    将一串大小写混合的字符全部转成大小字符输出

    第六题
    试题 E: 123(我是压缩打表)

    时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
    【问题描述】
    小蓝发现了一个有趣的数列,这个数列的前几项如下:
    1, 1, 2, 1, 2, 3, 1, 2, 3, 4, …
    小蓝发现,这个数列前 1 项是整数 1,接下来 2 项是整数 1 至 2,接下来
    3 项是整数 1 至 3,接下来 4 项是整数 1 至 4,依次类推。
    小蓝想知道,这个数列中,连续一段的和是多少。
    【输入格式】
    输入的第一行包含一个整数 T,表示询问的个数。
    接下来 T 行,每行包含一组询问,其中第 i 行包含两个整数 li 和 ri,表示
    询问数列中第 li 个数到第 ri 个数的和。
    【输出格式】
    输出 T 行,每行包含一个整数表示对应询问的答案。
    【样例输入】
    3
    1 1
    1 3
    5 8
    【样例输出】
    1
    4
    8
    【评测用例规模与约定】
    对于 10% 的评测用例,1 ≤ T ≤ 30, 1 ≤ li ≤ ri ≤ 100。
    对于 20% 的评测用例,1 ≤ T ≤ 100, 1 ≤ li ≤ ri ≤ 1000。
    对于 40% 的评测用例,1 ≤ T ≤ 1000, 1 ≤ li ≤ ri ≤ 106。
    对于 70% 的评测用例,1 ≤ T ≤ 10000, 1 ≤ li ≤ ri ≤ 109。
    对于 80% 的评测用例,1 ≤ T ≤ 1000, 1 ≤ li ≤ ri ≤ 1012。
    对于 90% 的评测用例,1 ≤ T ≤ 10000, 1 ≤ li ≤ ri ≤ 1012。
    对于所有评测用例,1 ≤ T ≤ 100000, 1 ≤ li ≤ ri ≤ 1012。
    第七题
    巧克力问题

    大概题意就是给你,一些种类的巧克力,每一种巧克力有保质期,单价和数目,过期的巧克力不能选择,一天吃一颗巧克力,给你一个时间t,问如何在时间t天吃最低价格的巧克力。
    第八题
    试题 H: 翻转括号序列

    时间限制: 2.0s 内存限制: 512.0MB 本题总分:20 分
    【问题描述】
    给定一个长度为 n 的括号序列,要求支持两种操作:

    1. 将 [Li
      , Ri
      ] 区间内(序列中的第 Li 个字符到第 Ri 个字符)的括号全部翻
      转(左括号变成右括号,右括号变成左括号)。
    2. 求出以 Li 为左端点时,最长的合法括号序列对应的 Ri (即找出最大的
      Ri 使 [Li
      , Ri
      ] 是一个合法括号序列)。
      【输入格式】
      输入的第一行包含两个整数 n, m,分别表示括号序列长度和操作次数。
      第二行包含给定的括号序列,括号序列中只包含左括号和右括号。
      接下来 m 行,每行描述一个操作。如果该行为 “1 Li Ri”,表示第一种操作,
      区间为 [Li
      , Ri
      ] ;如果该行为 “2 Li” 表示第二种操作,左端点为 Li。
      【输出格式】
      对于每个第二种操作,输出一行,表示对应的 Ri。如果不存在这样的 Ri,
      请输出 0。
      【样例输入】
      7 5
      ((())()
      2 3
      2 2
      1 3 5
      2 3
      2 1
      【样例输出】
      4
      7
      0
      0
      【评测用例规模与约定】
      对于 20% 的评测用例,n, m ≤ 5000;
      对于 40% 的评测用例,n, m ≤ 30000;
      对于 60% 的评测用例,n, m ≤ 100000;
      对于所有评测用例,1 ≤ n ≤ 106
      , 1 ≤ m ≤ 2 × 105。
      试题 I: 异或三角
      时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分

      【问题描述】
      给定 T 个数 n1, n2, · · · , nT,对每个 ni 请求出有多少组 a, b, c 满足:
    3. 1 ≤ a, b, c ≤ ni;
    4. a ⊕ b ⊕ c = 0,其中 ⊕ 表示二进制按位异或;
    5. 长度为 a, b, c 的三条边能组成一个三角形。
      【输入格式】
      输入的第一行包含一个整数 T。
      接下来 T 行每行一个整数,分别表示 n1, n2, · · · , nT。
      【输出格式】
      输出 T 行,每行包含一个整数,表示对应的答案。
      【样例输入】
      2
      6
      114514
      【样例输出】
      6
      11223848130
      【评测用例规模与约定】
      对于 10% 的评测用例,T = 1, 1 ≤ ni ≤ 200;
      对于 20% 的评测用例,T = 1, 1 ≤ ni ≤ 2000;
      对于 50% 的评测用例,T = 1, 1 ≤ ni ≤ 2
      20;
      对于 60% 的评测用例,1 ≤ T ≤ 100000, 1 ≤ ni ≤ 2
      20;
      对于所有评测用例,1 ≤ T ≤ 100000, 1 ≤ ni ≤ 2
      30。
      最后一题也都没看。
    展开全文
  • 第十二届蓝桥杯国赛总结 前言: 考完省赛感觉蓝桥杯真水,考完国赛我感觉是我太水了。 在拿到编程题目以后我的感觉只有不知如何开始,虽然考点平时都有练过,各种优化、一些好的思想都应用过,比如以前介绍过的...

    第十二届蓝桥杯国赛总结

    前言:
    考完省赛感觉蓝桥杯真水,考完国赛我感觉是我太水了,但还是拿了国一。

    在拿到编程题目以后我的感觉只有不知如何开始,虽然考点平时都有练过,各种优化、一些好的思想都应用过,比如以前介绍过的寄存器思想,状态机,结构体优化,模块化编程。。。但这次我感觉难度不亚于第十届国赛,是因为这次国赛对基础和逻辑处理能力还是比较高的要求,我也很高兴能够做这样的题目。下面就个人在本次编程中的优点进行解析。

    1.超声波测距条件之定时模式

    在超声波测距模式为定时模式时:超声波以规定的时间周期进行采样;
    假设 x:为采样时间 (方法见下)
    由于题目用到了DS1302所以我们假设 timer_init[2] : 用其秒值

    方法就是 if(!(timer_init[2] % x) == 0)
    即实现触发以后距离下次触发需要‘x’秒的效果;
    触发以后就可以检测一次超声波了;但同时也伴随问题出现,就是可能在这一秒内多次触发,这里我用了笨方法,做一个标志位采集上一次触发的时间,如果上一次触发时间和本次触发时间相同的话就不进行采样了;

    采样时间方法:
    题目要求采样时间是2,3,5,7,9;
    我用的数组包含进去了,然后做个标志位,通过不断控制标志位的加而改变数组显示的内容;
    例如:
    unsigned char csb_delay[5] = {2,3,5,7,9};
    unsgned char number;
    如果我想改变显示值,我就只需要改变number就可以了,最后处理时显示csb_delay[number];

    2.超声波测距条件之触发模式

    这里用了状态机

    static unsigned char mode; 
    switch(mode)
    {
    	case 0:  //等亮
    		if(ad_number > 70) //光敏电阻阻值
    		{
    			mode = 1;
    		} 
    		break;
    	case 1:  //等暗 
    		if(ad_number <= 70) //光敏电阻阻值
    		{
    			csb_number = read_csb_fun(); //测距
    			mode = 0;//仅触发一次
    		} 
    		break;
    }
    

    好处是遮挡以后仅触发一次,不需要标志位。 而且扩展性和功能性都比较强,如果题目换成遮挡后松开,仍然可以应对。

    3.超声波测距距离参数比较近时

    这里我突发奇想,想到了一个绝顶的妙招。

    //csb_number: 超声波距离
    //csb_data:  超声波参数
    if(((csb_number  - 5) > csb_data) || ((csb_number  + 5) < csb_data)))
    {
    
    }
    else
    {
    		//说明超声波测距距离参数比较近
    }
    //思想是:如果测距结果很小 + 误差 也小于参数时;说明比参数小得多;
    //     	 如果测距结果很大 - 误差 也大于参数时;说明比参数大得多;
    

    这里不太好理解,大概解释下原理:

    如果测距长度 > 规定参数时
    呢末就不需要考虑 (csb_number + 5) < csb_data) 这部分;
    只需要考虑:参数 - 误差 是否还大 数据
    如果仍然大于 说明其误差大于误差范围;

    如果测距参数 < 规定参数时
    就不需要考虑 (csb_number - 5) > csb_data) 这部分;
    只需要考虑:参数 + 误差 是否小于 数据
    如果仍然小于 说明其误差小于误差范围;

    如果不满足反之说明在误差范围内;
    汇成一句话:加针对小,减针对大

    4.其他

    1.最大最小平均值

    最大值初始值为:0;
    最小值初始值为:999;
    再将采集的值和最大值,最小值比较,即可 没啥讲的,但为什么这么设计,原因很简单,你反过来试试就知道了;

    2.DAC输出

    这个和省赛比较像,初中生问题!会解方程就行。
    设 y = kx +b; (x: 为距离 y:为输出DA值)
    x = 10; y = 51; x = 80; y = 255;
    解得: y = 3x + 21;

    3.控制好运行模式切换

    这点就很重要了,可以采用以前说的寄存器思想,不断改变寄存器的值,在显示服务函数中检测寄存器的状态来达到不同的显示结果。

    展开全文
  • 2021年第十二届蓝桥杯国赛javaB组 国赛结束了。。。 第二个填空题计算机算了十分钟都未出结果。。。 前面三个大题都比较简单。。。 最近比较忙,忙完之后再来写。。。。。

    2021年第十二届蓝桥杯国赛javaB组

    试题A: 整数范围
    试题B: 纯质数
    试题C: 完全日期
    试题D: 最小权值
    试题E: 大写
    试题F: 123
    试题G: 和与乘积
    试题H: 巧克力
    试题I: 翻转括号序列
    试题J: 异或三角

    试题A: 整数范围
    本题总分:5 分
    【问题描述】
      用8位二进制(一个字节)来表示一个非负整数,表示的最小值是0,则一般能表示的最大值是多少?

    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

    答案:255

    试题B: 纯质数
    本题总分:5 分
    【问题描述】

    如果一个正整数只有1和它本身两个约数,则称为一个质数(又称素数)。
      前几个质数是:2,3,5,7,11,13,17,19,23,29,31,37…。
      如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2,3,5,7,23,37都是纯质数,而11,13,17,19,29,31不是纯质数。当然1,4,35也不是纯质数。
      请问,在1到20210605中,有多少个纯质数?

    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

    答案:1903

    试题C: 完全日期
    本题总分:10 分
    【问题描述】

    如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。
      例如:2021年6月5日的各位数字之和为2 + 0 + 2 + 1 + 6 + 5 = 16,而16是一个完全平方数,它是4的平方。所以2021年6月5日是一个完全日期。
      例如:2021年6月23日的各位数字之和为2 + 0 + 2 + 1 + 6 + 2 + 3 = 16,是一个完全平方数。所以2021年6月23日也是一个完全日期。
      请问,从2001年1月1日到2021年12月31日中,一共有多少个完全日期?

    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

    答案:977

    试题D: 最小权值
    本题总分:10 分
    【问题描述】

    对于一棵有根二叉树T,小蓝定义这棵树中结点的权值W(T)如下:
      空子树的权值为0。
      如果一个结点v有左子树L,右子树R,分别有C(L)和C®个结点,则:
        W(v) = 1 + 2W(L) + 3W® +(C(L))2C®。
      树的权值定义为树的根结点的权值。
      小蓝想知道,对于一棵有2021个结点的二叉树,树的权值最小可能是多少?

    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

    答案:______

    试题E: 大写
    时间限制: 1.0s  内存限制: 512.0MB  本题总分:15分
    【问题描述】

    给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母转换成大写字母后将字符串输出。

    【输入格式】
    输入一行包含一个字符串
    【输出格式】
    输出转换成大写后的字符串。
    【样例输入1】
    LanQiao
    【样例输出1】
    LANQIAO
    【评测用例规模与约定】
    对于所有评测用例,字符串的长度不超过100。

    方法一:使用java的String类自带的转换大小写的toUpperCase()方法。

    import java.util.Scanner;
    public class Main {
    		public static void main(String[] args) {
    			Scanner input = new Scanner(System.in);
    			String a = input.next();
    			String b = a.toUpperCase();
    			System.out.println(b);
    		}
    		}
    

    方法二:

    
    import java.util.*;
    public class Main {
    		public static void main(String[] args) {
    			Scanner input = new Scanner(System.in);
    			String a = input.next();
    			
    			String daxie="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    			String xiaoxie="abcdefghijklmnopqrstuvwxyz";
    			int len=a.length();
    			for(int i=0;i<len;i++) {
    				for(int j=0;j<26;j++) {
    					if(a.charAt(i)==daxie.charAt(j)) {
    						System.out.print(daxie.charAt(j));
    						break;
    					}
    					else if(a.charAt(i)==xiaoxie.charAt(j)) {
    						System.out.print(daxie.charAt(j));
    						break;
    					}
    				}
    				
    			}
    		}
    	}
    
    

    试题F: 123
    时间限制: 5.0s   内存限制: 512.0MB   本题总分:15分
    【问题描述】

    小蓝发现了一个有趣的数列,这个数列的前几项如下:
        1, 1, 2, 1, 2, 3, 1, 2, 3, 4, …
      小蓝发现,这个数列前1项是整数1,接下来2项是整数1至2,接下来3项是整数1至3,接下来4项是整数1至4,依次类推。
      小蓝想知道,这个数列中,连续一段的和是多少。

    【输入格式】
    输入的第一行包含一个整数T,表示询问的个数。
    接下来T行,每行包含一组询问,其中第i行包含两个整数li和ri,表示询问数列中第li个数到第ri个数的和。
    【输出格式】
    输出T行,每行包含一个整数表示对应询问的答案。
    【样例输入】
    3
    1 1
    1 3
    5 8
    【样例输出】
    1
    4
    8
    【评测用例规模与约定】
    在这里插入图片描述

    只能拿到70%的分。。。。。。

    import java.util.*;
    public class Main {
    		public static void main(String[] args) {
    			Scanner input = new Scanner(System.in);
    			int xunwencishu=input.nextInt();
    			int left[]=new int[xunwencishu];
    			int right[]=new int[xunwencishu];
    			int max=0;//表示对该序列询问的最大长度,以该值确定序列的大致长度,当然应该也可以不用考虑这个。。
    			for(int i=0;i<xunwencishu;i++) {
    				left[i]=input.nextInt();
    				if(left[i]>max) {
    					max=left[i];
    				}
    				right[i]=input.nextInt();
    				if(right[i]>max) {
    					max=right[i];
    				}
    			}
    			
    			int xulie []=new int[max+1];
    			int index=0;
    			//根据题意,初始化序列。
    			for(int i=1;index<=max;i++) {
    				for(int j=1;j<=i;j++) {
    					if(index<=max)
    					xulie[index++]=j;
    				}
    				
    			}
    			
    			for(int i=0;i<xunwencishu;i++) {
    				int sum=0;
    				
    			for(int j=left[i]-1;j<=right[i]-1;j++) {
    				sum+=xulie[j];
    				
    			}
    				System.out.println(sum);
    				
    			}
    			
    		}
    	}
    	
    

    试题G: 和与乘积

    在这里插入图片描述

    一种解法:

    应该拿不了满分。。。。
    import java.util.*;
    public class Main {
    		public static void main(String[] args) {
    public static void main(String[] args) {
    			Scanner input = new Scanner(System.in);
    			int n=input.nextInt();
    			int a[]=new int[n];
    			for(int i=0;i<n;i++) {
    				a[i]=input.nextInt();
    			}
    			
    			int count=0;
    			int ji=1;
    			int sum=0;
    			for(int i=0;i<n;i++) {
    				ji=1;
    				sum=0;
    				for(int j=i;j<n;j++) {
    					ji*=a[j];
    					sum+=a[j];	
    							if(sum==ji) {
    								count++;
    								}
    				}
    			}
    			System.out.println(count);
    			
    		}
    	}
    

    待更。。。。

    展开全文
  • 第十二届蓝桥杯国赛真题+题解 Python

    热门讨论 2021-06-06 12:47:21
    2021年蓝桥杯国赛第十二界蓝桥杯软件赛决赛 Python 答题分析,附有完整题目 A. 带宽 B.纯质数 C.完全日期 D.最小权值 E.大写 F.123 G.冰山 H.和与乘积 I.二进制问题 J.翻转括号序列

    写在前面

    本次蓝桥杯国赛的题目,感觉质量比省赛时好了不少,题目难易适中,有难有易。不得不吐槽一下早上的打车经历,到考场10分钟左右的车程,愣是等车等了20分钟。

    比赛超常发挥,我没想过我能把10道题全做出来。把自己的解题思路写在这里,也仅代表我个人理解得出的思路,不代表官方答案,欢迎大家交流,指正错误。

    题目不太完整,没找到Python A组的完整试题,就从CA和CB里找了些一样的题。后续再补充。少两个题目,只记得一个是二进制计 1 1 1,另一个就不记得了。


    拿到全部题目了,更新一下。——2021.6.7


    试题A:带宽

    本题总分:5分

    【问题描述】

    小蓝家的网络带宽是 200 M b p s 200 Mbps 200Mbps,请问,使用小蓝家的网络理论上每秒钟最 多可以从网上下载多少 M B MB MB 的内容。

    【思路分析】

    这个题就比较简单了,签到题,Mbps/8就是实际速度

    【参考答案】

    25
    

    试题 B: 纯质数

    本题总分:5 分

    【问题描述】

    如果一个正整数只有 1 1 1 和它本身两个约数,则称为一个质数(又称素数)。

    前几个质数是: 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , . . . 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, ... 2,3,5,7,11,13,17,19,23,29,31,37,...

    如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如: 2 , 3 , 5 , 7 , 23 , 37 2, 3, 5, 7, 23, 37 2,3,5,7,23,37 都是纯质数,而 11 , 13 , 17 , 19 , 29 , 31 11, 13, 17, 19, 29, 31 11,13,17,19,29,31 不是纯质数。当然 1 , 4 , 35 1, 4, 35 1,4,35 也不是纯质数。

    请问,在 1 1 1 20210605 20210605 20210605 中,有多少个纯质数?

    【思路分析】

    这个题比较直观,首先判断[1、4、6、8、9、0]在这个数里边,就一定不是纯质数。

    def isPurePrime(n):
        s = str(n)
        for i in range(len(s)):
            if s[i] == '0' or s[i] == '1' or s[i] == '4' or s[i] == '6' or s[i] == '8' or s[i] == '9':
                return False
        if isPrime(n):
            return True
        return False
    

    然后如果都不在,再判断这个数是不是质数,例如22

    def isPrime(n):
        if n <= 3:
            return n >= 2
        if (n + 1) % 6 != 0 and (n - 1) % 6 != 0:
            return False
        for i in range(2, int(n ** 0.5) + 1):
            if n % i == 0:
                return False
        return True
    

    最后循环跑一下结果就出来了

    【参考答案】

    1903
    

    比赛时把0忘了,心里默念 m m p mmp mmp


    试题C: 完全日期

    本题总分:10 分

    【问题描述】

    如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。

    例如: 2021 2021 2021 6 6 6 5 5 5 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 16 2 + 0 + 2 + 1 + 6 + 5 = 16 2+0+2+1+6+5=16 ,而 16 16 16 是一个完全平方数,它是 4 4 4 的平方。所以 2021 2021 2021 6 6 6 5 5 5 日是一个完全日期。

    例如: 2021 2021 2021 6 6 6 23 23 23 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16 2+0+2+1+6+2+3=16,是一个完全平方数。所以 2021 2021 2021 6 6 6 23 23 23 日也是一个完全日期。

    请问,从 2001 2001 2001 1 1 1 1 1 1 日到 2021 2021 2021 12 12 12 31 31 31 日中,一共有多少个完全日期?

    【思路分析】

    常规日期题,模拟日期操作然后判断即可。日期,最大 8 8 8 位数,且最大的和为2+0+1+9+1+2+3+1=19这里经过大佬指正,最大的和应为 2 + 0 + 1 + 9 + 1 + 2 + 2 + 9 = 26 2+0+1+9+1+2+2+9=26 2+0+1+9+1+2+2+9=26,所以可以提前算出来[1,4,9,16,25]这几个数,然后直接判断即可,不必重复计算。

    def wonderDate(year, month, day):
        date = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
        year = list(map(int, list(str(year))))
        month = list(map(int, list(str(month))))
        day = list(map(int, list(str(day))))
        return sum(year) + sum(month) + sum(day) in date
    
    
    year, month, day, c = 2001, 1, 1, 0
    while year < 2022:
        if wonderDate(year, month, day):
            c += 1
        day += 1
        if year in [2004, 2008, 2012, 2016, 2020] and month == 2 and day > 29:
            day = 1
            month += 1
        elif month == 2 and day > 28:
            day = 1
            month += 1
        elif month in [1, 3, 5, 7, 8, 10, 12] and day > 31:
            day = 1
            month += 1
        elif month in [4, 6, 9, 11] and day > 30:
            day = 1
            month += 1
        if month > 12:
            month = 1
            year += 1
    print(c)
    

    【参考答案】

    977
    

    试题D: 最小权值

    本题总分:10 分

    【问题描述】

    对于一棵有根二叉树 T T T,小蓝定义这棵树中结点的权值 W ( T ) W(T) W(T) 如下:

    空子树的权值为 0 0 0

    如果一个结点 v v v 有左子树 L L L, 右子树 R R R,分别有 C ( L ) C(L) C(L) C ( R ) C(R) C(R) 个结点,则

    W ( v ) = 1 + 2 W ( L ) + 3 W ( R ) + ( C ( L ) ) 2 C ( R ) 。 W(v) = 1 + 2W(L) + 3W(R) + (C(L))^2 C(R)。 W(v)=1+2W(L)+3W(R)+(C(L))2C(R)

    树的权值定义为树的根结点的权值。

    小蓝想知道,对于一棵有 2021 2021 2021 个结点的二叉树,树的权值最小可能是多 少?

    【问题分析】

    这个题不太会做,蒙了一下,觉得应该是一棵完全二叉树,并且多余的部分肯定是在右侧,因为左边的子节点数量是平方。

    然后开始模拟。

    nodes = [[0],
            [0,0],
            [0,0,0,0]]  # 这是模拟那棵2021个节点的树,太占地方就不放完了
    for i in range(1024 - 998 + 1, len(nodes[9])):  # 初始化底层状态
        nodes[9][i] = 1
    for i in range(8, -1, -1):
        for j in range(len(nodes[i])):
            # 根据公式计算,其中完全二叉树左下节点数量和右下节点数量 = 2**子节点层数-1
            nodes[i][j] = 1 + 2 * nodes[i + 1][j * 2] + 3 * nodes[i + 1][j * 2 + 1] + ((2 ** (10 - i) - 1) ** 2) * (2 ** (10 - i) - 1)
    for i in nodes:
        print(i)
    print(nodes[0][0])
    

    写到这儿,又发现一个问题,这棵树左下节点不能直接按照 2 n − 1 − 1 2^{n-1}-1 2n11 来算,又错了,,答案就不放了,这个思路可供也仅供参考。


    试题 E: 大写

    时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分

    【问题描述】

    给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母 转换成大写字母后将字符串输出。

    【输入格式】

    输入一行包含一个字符串。

    【输出格式】

    输出转换成大写后的字符串。

    【样例输入 1】

     LanQiao
    

    【样例输出 1】

     LANQIAO
    

    【思路分析】

    签到题

    【代码】

    print(input().upper())
    

    试题 F: 123

    时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分

    【问题描述】

    小蓝发现了一个有趣的数列,这个数列的前几项如下:

    1 , 1 , 2 , 1 , 2 , 3 , 1 , 2 , 3 , 4 , . . 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, .. 1,1,2,1,2,3,1,2,3,4,..

    小蓝发现,这个数列前 1 1 1 项是整数 1 1 1,接下来 2 2 2 项是整数 1 1 1 2 2 2,接下来 3 3 3 项是整数 1 1 1 3 3 3,接下来 4 4 4 项是整数 1 1 1 4 4 4,依次类推。

    小蓝想知道,这个数列中,连续一段的和是多少。

    【输入格式】

    输入的第一行包含一个整数 T T T,表示询问的个数。

    接下来 T T T 行,每行包含一组询问,其中第 i i i 行包含两个整数 l i l_i li r i r_i ri,表示 询问数列中第 l i l_i li 个数到第 r i r_i ri 个数的和。

    【输出格式】

    输出 T T T 行,每行包含一个整数表示对应询问的答案。

    【样例输入】

    3
    1 1
    1 3
    5 8
    

    【样例输出】

    1
    4
    8
    

    【思路分析】

    这个题我没找到啥太好的规律,就只能通过模拟的方式模拟数组,然后出区间和,通过判断最大值,降低一定的时间。估计超时不能拿满分。

    【代码实现】

    n = int(input())
    l, r = [], []
    for i in range(n):
        s = input().split()
        l.append(int(s[0]))
        r.append(int(s[1]))
    m = max(r)
    m_c = m + 0
    row = 1
    while m_c > 0:
        for i in range(row):
            m_c -= 1
        row += 1
    row -= 1
    ls = []
    for i in range(1, row + 1):
        for j in range(1, i + 1):
            ls.append(j)
    for i in range(n):
        print(sum(ls[l[i] - 1:r[i]]))
    

    试题 G: 冰山

    时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分

    【问题描述】

    一片海域上有一些冰山,第 i i i 座冰山的体积为 V i V_i Vi

    随着气温的变化,冰山的体积可能增大或缩小。第 i i i 天,每座冰山的变化 量都是 X i X_i Xi。当 X i > 0 X_i > 0 Xi>0 时,所有冰山体积增加 X i X_i Xi;当 X i < 0 X_i < 0 Xi<0 时,所有冰山体积减 少 − X i −X_i Xi;当 X i = 0 X_i = 0 Xi=0 时,所有冰山体积不变。

    如果第 i i i 天某座冰山的体积变化后小于等于 0 0 0,则冰山会永远消失。

    冰山有大小限制 k k k。如果第 i i i 天某座冰山 j j j 的体积变化后 V j V_j Vj 大于 k k k,则它 会分裂成一个体积为 k k k 的冰山和 V j − k V_j − k Vjk 座体积为 1 1 1 的冰山。

    i i i 天结束前(冰山增大、缩小、消失、分裂完成后),会漂来一座体积为 Y i Y_i Yi 的冰山( Y i = 0 Y_i = 0 Yi=0 表示没有冰山漂来)。

    小蓝在连续的 m m m 天对这片海域进行了观察,并准确记录了冰山的变化。小 蓝想知道,每天结束时所有冰山的体积之和(包括新漂来的)是多少。

    由于答案可能很大,请输出答案除以 998244353 998244353 998244353 的余数。

    【输入格式】

    输入的第一行包含三个整数 n , m , k n, m, k n,m,k分别表示初始时冰山的数量、观察的 天数以及冰山的大小限制。

    第二行包含 n n n 个整数 V 1 , V 2 , . . . , V n V_1, V_2, ... , V_n V1,V2,...,Vn,表示初始时每座冰山的体积。

    接下来 m m m 行描述观察的 m m m 天的冰山变化。其中第 i i i 行包含两个整数 X i , Y i X_i , Y_i Xi,Yi, 意义如前所述。

    【输出格式】

    输出 m m m 行,每行包含一个整数,分别对应每天结束时所有冰山的体积之和 除以 998244353 998244353 998244353 的余数。

    【样例输入】

    1 3 6
    1
    6 1
    2 2
    -1 1
    

    【样例输出】

    8
    16
    11
    

    【样例说明】

    在本样例说明中,用 [ a 1 , a 2 , . . . , a n ] [a_1, a_2, ... , a_n] [a1,a2,...,an] 来表示每座冰山的体积。

    初始时的冰山为 [ 1 ] [1] [1]

    1 1 1 天结束时,有 3 3 3 座冰山: [ 1 , 1 , 6 ] [1, 1, 6] [1,1,6]

    2 2 2 天结束时,有 6 6 6 座冰山: [ 1 , 1 , 2 , 3 , 3 , 6 ] [1, 1, 2, 3, 3, 6] [1,1,2,3,3,6]

    3 3 3 天结束时,有 5 5 5 座冰山: [ 1 , 1 , 2 , 2 , 5 ] [1, 1, 2, 2, 5] [1,1,2,2,5]

    【思路分析】

    这个题虽然看起来很长,但仔细读其实也不难,跟着步骤一步步去模拟就行了。但要注意避坑:

    分裂的话,比如上限是6,有个冰山是8,不是分裂成[6,2],而是分解成[6,1,1]。最后记得%998244353

    这个题的数据量也比较大,可能跑不完。

    【代码实现】

    n, m, k = map(int, input().split())  # 冰山数量、观察天数、大小限制
    ices = list(map(int, input().split()))  # 每座冰山
    for i in range(m):
        x, y = map(int, input().split())  # X:冰山每天的变化量  Y: 结束时飘来的冰山
        for i in range(len(ices)):
            ices[i] += x
        if x > 0:  # 增加,要考虑分裂
            for i in range(len(ices)):
                if ices[i] > k:
                    for j in range(ices[i] - k):
                        ices.append(1)
                    ices[i] = k
        else:  # 减少,考虑消失
            ices = list(filter(lambda x: x > 0, ices))
        ices.append(y)  # 飘来一座冰山
        print(sum(ices) % 998244353)
    

    试题 H: 和与乘积

    时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分

    【问题描述】

    给定一个数列 A = ( a 1 , a 2 , . . . , a n ) A = (a_1, a_2, ... , a_n) A=(a1,a2,...,an),问有多少个区间 [ L , R ] [L, R] [L,R] 满足区间内元素 的乘积等于他们的和,即 a L ∗ a L + 1 . . . a R = a L + a L + 1 + . . . + a R a_L * a_{L+1} ... a_R = a_L + a_{L+1} + ... + a_R aLaL+1...aR=aL+aL+1+...+aR

    【输入格式】

    输入第一行包含一个整数 n n n,表示数列的长度。

    第二行包含 n 个整数,依次表示数列中的数 a 1 , a 2 , . . . , a n a_1, a_2, ... , a_n a1,a2,...,an

    【输出格式】

    输出仅一行,包含一个整数表示满足如上条件的区间的个数。

    【样例输入】

    4
    1 3 2 2
    

    【样例输出】

    6
    

    【样例解释】

    符合条件的区间为 [ 1 , 1 ] , [ 1 , 3 ] , [ 2 , 2 ] , [ 3 , 3 ] , [ 3 , 4 ] , [ 4 , 4 ] [1, 1], [1, 3], [2, 2], [3, 3], [3, 4], [4, 4] [1,1],[1,3],[2,2],[3,3],[3,4],[4,4]

    【思路分析】

    这个题,两层for循环遍历一下就出来了,就是不知道能不能跑通所有测试点。。。

    【代码实现】

    n = int(input())
    ls = list(map(int, input().split()))
    c = 0
    for i in range(n):
        s = 0
        cj = 1
        for j in range(n - i - 1, n):
            s += ls[j]
            cj *= ls[j]
            if s == cj:
                c += 1
    print(c)
    

    试题 I: 二进制问题

    时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分

    【问题描述】

    小蓝最近在学习二进制。他想知道 1 1 1 N N N 中有多少个数满足其二进制表示 中恰好有 K K K 1 1 1。你能帮助他吗?

    【输入格式】

    输入一行包含两个整数 N N N K K K

    【输出格式】

    输出一个整数表示答案。

    【样例输入】

    7 2
    

    【样例输出】

    3
    

    【思路分析】

    这个题乍一看也比较简单哈,第一遍做的时候秒出。

    n, k = map(int, input().split())
    c = 0
    for i in range(1, n + 1):
        if bin(i).count('1') == k:
            c += 1
    print(c)
    

    后来做完全部的题还有1个多小时,我就开始检查,检查到这,想着好歹是个25分的题,不应该这么简单啊。然后看了下测试样例

    1. 对于 30 % 30\% 30% 的评测用例, 1 ≤ N ≤ 106 1 ≤ N ≤ 106 1N106 , 1 ≤ K ≤ 10 1 ≤ K ≤ 10 1K10
    2. 对于 60 % 60\% 60% 的评测用例, 1 ≤ N ≤ 2 × 1 0 9 , 1 ≤ K ≤ 30 1 ≤ N ≤ 2 × 10^9 , 1 ≤ K ≤ 30 1N2×109,1K30
    3. 对于所有评测用例, 1 ≤ N ≤ 1 0 18 , 1 ≤ K ≤ 50 1 ≤ N ≤ 10^{18} , 1 ≤ K ≤ 50 1N1018,1K50

    仅仅到 2 ∗ 1 0 7 2*10^7 2107就很费劲了,1秒之内肯定是跑不完的,也就是按原程序估计最多拿40%的分数。于是在想办法优化这个算法。

    1. 首先,k最大二进制的长度,就不用算了,肯定是 0 0 0,比如,7111,但如果k=4,那肯定就不用算了呀

    2. 其次,由于这是找有几个,跟大小并没有关系,例如从7里边找217111,找两个,那就是数学上的组合问题, C 3 2 C_3^2 C32

      C 5 3 = ( 5 ∗ 4 ∗ 3 ) / ( 3 ∗ 2 ∗ 1 ) C_5^3=(5*4*3)/(3*2*1) C53=(543)/(321)

    3. 对于不是 2 n − 1 2^n-1 2n1的数字,拿12举例,12=0b1100,这时如果统计3位的话,那么肯定会出错的,我们可以通过len(bin(12)[2:])-1的方式得到3,即低一位111的情况,

    4. 然后就可以使用 C 3 3 C_3^3 C33的方式,求到1

    5. 然后剩下的,再从8开始循环,到12结束。

    6. 如此一来,可节约一定的时间。但还是没办法跑通最大的测试点。能多跑些分是些分吧。

    【代码实现】

    import functools
    
    
    @functools.lru_cache()
    def C(down, up):
        fz, fm = 1, 1
        for i in range(1, up + 1):
            fm *= down
            down -= 1
            fz *= i
        return fm // fz
    
    
    n, k = map(int, input().split())
    if k > len(bin(n)[2:]):
        print(0)
        exit()
    l = len(bin(n)[2:]) - 1
    c = C(l, k)
    new_b = int('1' + '0' * l, 2)
    for i in range(new_b, n + 1):
        if bin(i).count('1') == k:
            c += 1
    print(c)
    

    被自己蠢到了,考试的时候没想着直接写一个C方法,而是写了阶乘,然后用阶乘乘除得到Cxx,白白浪费时间。。。


    试题 J: 翻转括号序列

    时间限制: 2.0s 内存限制: 512.0MB 本题总分:25 分

    【问题描述】

    给定一个长度为 n n n 的括号序列,要求支持两种操作:

    1. [ L i , R i ] [L_i , R_i ] [Li,Ri] 区间内(序列中的第 L i L_i Li 个字符到第 R i R_i Ri 个字符)的括号全部翻 转(左括号变成右括号,右括号变成左括号)。
    2. 求出以 L i L_i Li 为左端点时,最长的合法括号序列对应的 R i R_i Ri (即找出最大的 R i R_i Ri 使 [ L i , R i ] [L_i , R_i ] [Li,Ri] 是一个合法括号序列)。

    【输入格式】

    输入的第一行包含两个整数 n , m n, m n,m,分别表示括号序列长度和操作次数。

    第二行包含给定的括号序列,括号序列中只包含左括号和右括号。

    接下来 m m m 行,每行描述一个操作。如果该行为 “ 1 1 1 L i L_i Li R i R_i Ri”,表示第一种操作, 区间为 [ L i , R i ] [L_i , R_i ] [Li,Ri] ;如果该行为 “ 2 2 2 L i L_i Li” 表示第二种操作,左端点为 L i L_i Li

    【输出格式】

    对于每个第二种操作,输出一行,表示对应的 R i R_i Ri。如果不存在这样的 R i R_i Ri, 请输出 0 0 0

    【样例输入】

    7 5
    ((())()
    2 3
    2 2
    1 3 5
    2 3
    2 1
    

    【样例输出】

    4
    7
    0
    0
    

    【思路分析】

    这个题跟冰山题一样,乍一看比较复杂,但其实也不难,一步步走就行。

    这里也要注意避个坑:序列内的括号全部翻转。。这个我刚开始理解错了,不是顺序翻转,而是())(

    判断是否有完整的括号序列,可以用这个方式实现,逐个删除完整括号,最后判断长度即可:

    while '()' in s:
        s = s.replace('()', '')
    if len(s) == 0:
    

    【代码实现】

    n, m = map(int, input().split())
    kh = list(input())
    for i in range(m):
        o = input().split()
        if o[0] == '1':
            l = int(o[1])
            r = int(o[2])
            for i in range(l - 1, r):
                if kh[i] == '(':
                    kh[i] = ')'
                else:
                    kh[i] = '('
        else:
            l = int(o[1])
            r = n + 0
            while r > l:
                s = ''.join(kh[l - 1:r])
                while '()' in s:
                    s = s.replace('()', '')
                if len(s) == 0:
                    break
                r -= 1
            if r > l:
                print(r)
            else:
                print(0)
    

    完整真题

    完整题目及代码网盘自取:

    https://pan.baidu.com/s/198t23JyVNftFSZzYyvYqKg

    提取码:yoyo

    展开全文
  • 第十二届蓝桥杯国赛 冰山题解 splay树 题目 暂时搞不到原题目先空在这里。 思路 个人觉得模拟会超时超内存(会有很多个1,甚至多于998244353),所以用splay树来操作,时间复杂度是O((n+3m)*log(n+3m)),题目总共三...
  • @2021第十二届蓝桥杯国赛B组 纯质数【python】 题目描述:如果一个正整数只有 11和它本身两个约数,则称为一个质数(又称素数)。 前几个质数是:2,3,5,7,11,13,17,19,23,29,31,37,· · · 。 如果一个...
  • sum = 0 for f in range(int(qishi[i]),int(jieshu[i])+1): sum +=shulie[f-1] print(sum) sum = 0 进制问题 具体流程:输一个数字后输出其进制,强制转换为字符串,替换掉开头的"0b",之后统计1的个数就行啦。...
  • [蓝桥杯]2021第十二届蓝桥杯国赛C/C++B组 前言 2021年6月,我参加了蓝桥杯国赛。 这是我第一次参加蓝桥杯国赛。 我将我的题解和分析记录于此。 希望这份来自于我个人的经验题解对于我、对于看这篇文章的你都有收获。...
  • 2021第十二届蓝桥杯国赛B组【c/c++】 昨天刚刚打完国赛,坐着校车晃啊晃啊一路颠簸啊呜呜呜呜呜…趁着今天脑子清醒了来一波。废话不多说,上题! A 带宽 问题描述 小蓝家的网络带宽是 200 Mbps,请问,使用小蓝家的...
  • 第十二届蓝桥杯国赛 cb

    千次阅读 2021-06-05 21:14:50
    文章目录A: 带宽 25B: 纯质数 1903C: 完全日期 977D: 最小权值 2653631372E: 大写F: 123G: 异或变换(候补)H: 进制问题I: 反转括号序列(候补)J: 异或三角形(候补)总结 A: 带宽 25 B: 纯质数 1903 考场上用的...
  • 题面: 题意: 操作1 把区间括号翻转 操作2 查询最长合法括号序列序列从l开始 思路: 类似于区间合并的问题,对于每个区间我们记录左右最小...0,那么我们就要分出一个后缀最大值等于sum的位置。 调了一下午调的心
  • 今天是2021年6月5日,刚参加完第十二届蓝桥杯JavaB组的国赛,心中的目标少了一个,我想这也是我大学生活中最后一个比赛了吧,感慨万千,心血来潮,想写一篇文章记录一下。 一、参赛过程 我的参赛地点是西安邮电...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,431
精华内容 572
关键字:

第十二届蓝桥杯国赛