第十二届蓝桥杯大赛第四期模拟赛

第十二届蓝桥杯大赛第四期模拟赛

请问在1900-2020中有多少个质数?

public class _A {
	public static void main(String[] args) {
		int ans = 0;
		for (int i = 1900; i <= 2020; i++) {
			if (i % 2 ==  0) continue;
			if (check(i)) {
				//查看所有的质数
				System.out.println(i);
				//答案
				ans++;
			}
		}
		System.out.println(ans);
	}
	private static boolean check(int n) {
		int sqrt = (int)Math.sqrt(n);
		for (int i = 2; i <= sqrt; i++) {
			if (n % i == 0) return false;
		}
		return true;
	}
}

B.ASCII码

ASCII码将每个字符对应到一个数值(编码),用于信息的表示和传输。在ASCII码中,英文字母是按从小到大的顺序
依次编码的,例如:字母A编码是65,字母B编码是66,字母C编码是67,请编码为80的是哪个字母?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个英文字母,在提交答案时只填写这个英文字
母,填写多余的内容将无法得分。

代码实现

public class _B {
	public static void main(String[] args) {
		System.out.println((char) 80);
	}
}

C.Fibonacci序列

问题描述
Fibonacci序列按照如下公式定义:
F[1] = 1
F[2] = 1
F[]= F[i-1] + F[i-2] (i>2)
前几个Fibonacci数为1,1,2,3, 5, 8, 13, 21。
请问,前100个Fibonacci数中,有多少个数是3的倍数?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写
多余的内容将无法得分。

tips:
因为到fib(44)左右时数据会超过 所以使用BigInteger。
res: 25

代码实现

public class _C {
	public static void main(String[] args) {
        int res = 0;
        for (int i = 2; i <= 100; i++) {
            BigInteger fibN = fibonacciNormal(i);
            if (fibN.mod(BigInteger.valueOf(3)).compareTo(BigInteger.valueOf(0)) == 0) {
                System.out.println(fibN);
                res++;
            }
        }
        System.out.println(res);
    }
    public static BigInteger fibonacciNormal(int n){
        if (n == 1) {
            return new BigInteger("0");
        }
        BigInteger n1 = new BigInteger("0"), n2 = new BigInteger("1"), sn = new BigInteger("0");
        for (int i = 0; i < n - 1; i++) {
            sn = n1.add(n2);
            n1 = n2;
            n2 = sn;
        }
        return sn;
    }
}

D.二叉树

问题描述
有一棵二叉树,有2021个叶结点。
请问。这棵树至少有多少个结点?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写
多余的内容将无法得分。
res : 4041

代码实现

A.对任何一棵二叉树:度为0的结点数(即叶节点) = 度为2的节点数 + 1;
B.当二叉树的总个数为奇数时,此二叉树"没有度为1"的结点;
C.当二叉树的总个数为偶数时,此二叉树"只有一个度为1"的结点;
以上是二叉树的一些特征。

这里让我们求最少有多少个节点。
根据题目条件:
	已知n0(度为0) = 2021;
	根据特征A得:
	n2 + 1 = 2021;
	n2 = 2020;
	根据特征B,C得:
	nodes = 2020 + 2021; || nodes = 2020 + 2021 + 1;
这里前者显然更满足题意。

E.身份证

不知

F1.小红买笔

问题摧述
小蓝在商店买文具,
1支钢笔x元,小蓝买了a支
1个笔记本y元,小蓝买了b本。
请问,小蓝1共需要支付多少钱?
输入格式
输入四行,
第-行包含1个整数x。
第二行包含1个整数a,
第三行包含1个整数y.
第四行包含1个整数b,
输出格式
输出一个整数,表示答案
样例输入
5
2
1
6
样例输出
16

代码实现

public class _F {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int x = sc.nextInt(), a = sc.nextInt(), y = sc.nextInt(), b = sc.nextInt();
		System.out.println(a*x+b*y);
	}
}

F2.摩尔斯电码

小Hi的公司经常举办回馈社会的爱心活动。这次小Hi作为志愿者带领社区的孩子们参观了青少年天文馆。
他发现孩子们对于摩尔.斯电码非常感兴趣。

摩尔斯电码由两种基本的信号组成:短信号“滴"(用字符:表示)以及长信号"嗒"(用字符-表示)。
下图是数字0-9的摩尔斯电码表示,每个数字都由5个字符组成:
“-----”,".----","…—","…–","…-","…","-…","–…","—…","----."
为了让孩子们开心,小Hi决定把每位孩子的生日日期转化为摩尔斯码赠送给他们。例如日期20210101对应的摩尔斯电码是:

你能写一个程序帮助小Hi吗?
输入格式
第一行是一个整数N,代表参加活动的孩子的人数。(1 <= N
<= 100)
以下N行每行一个由0- 9组成的字符串,代表一个生日日期。 (日
期格式: yyyymmdd,日期范围: 20000101 至20210101)
2
20161011
20000101
输出格式
对于每个生日日期,输出- -行表示转化后的摩尔斯码,数字之间
用一个空格隔开。
…— ----- .---- -… .---- ----- .---- .----
…— ----- ----- ----- ----- .---- ----- .----

代码实现

public class _F2 {
	public static void main(String[] args) {
		String[] ms = {"-----",".----","..---","...--","....-",".....","-....","--...","---..","----."};
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		String[] strs = new String[n];
		for (int i = 0; i < n; i++) {
			strs[i] = sc.next();
		}
		for (int i = 0; i < n; i++) {
			char[] chs = strs[i].toCharArray();
			for (int j = 0; j < chs.length; j++) {
				if (j == chs.length - 1) {
					System.out.println(ms[chs[j] - '0']);
				}else {
					System.out.print(ms[chs[j] - '0'] + " ");
				}
				
			}
		}
	}
}

G.首字母大写

G题
输入一串字符,将首字母大写,后续字母小写

代码实现

public class _G{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.nextLine();
		char[] a = s.toCharArray();
		if(a[0] >= 'a' && a[0] <= 'z') a[0] -= 32;  //先把首字母处理了
		for(int i = 1; i < a.length;i++){ //再处理后续字母
			if(a[i] >= 'A' && a[i] <= 'Z') a[i] += 32;
		}
		for (char c : a) {
			System.out.print(c);
		}
	}
}

H.递增三元组

给定一个序列(a_1,a_2… n), 定义序列中的一个递增三
元组是指三个下标i,j, k对应的三个元素a_i,a_j,a_k,这三个元素满足a_i<a_j<a_k.
例如序列(1,1,4,3,2,4)有以下4个递增三元组:
1.下标1,4,6对应的1,3,4;
2.下标1,5,6对应的1,2,4;
3.下标2,4,6对应的1,3,4;
4.下标2,5,6对应的1,2,4。
注意,可能有下标不同但对应数值相同的三元组,他们应当算成不同的三元组。
给定序列,请问序列中-共有多少个不同的递增三元组。
输出格式
输出一行,包含1个整数, 表示序列中的递增三元组数量。
请注意答案可能很大,可能超过32位二进制整数的范围,建议使用64位二进制整数。
样例输入
6
1 1 4 3 2 4
样例输出
4
数据规模和约定
对于30%的评测用例,1 <=n<= 20,0<=a i<= 10.
对于50%的评测用例,1 <=n<= 1000,0 <=a i<=100.
对于80%的评测用例,1 <=n <= 10000,0<=a i <=100.
对于所有评测用例,1 <=n <= 100000,0<=a i <=100.

代码实现

public class _H {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] a = new int[n];
		for (int i = 0; i < n; i++) a[i] = sc.nextInt();
		int p = 0; long res = 0;
		for (int i = 1; i < n - 1; i++) {
			if (a[p] < a[i] && p < (n - 2)) {
				for (int q = i + 1; q < n; q++) {
					if (a[q] > a[i]) {
						res += f(p, i, a);
					}
				}
			}
		}
		System.out.println(res);
	}
	public static long f(int p, int i, int[] a) {
		long res = 0;
		while (p < i) {
			if (a[p] < a[i]) {
				res++;
			}
			p++;
		}
		return res;
	}
}

I J还没做。

问题描述

小Hi正在研究1种特殊的栈。这种栈的元素既可以从栈顶出
栈,也可以从栈底出栈。(进栈还是只能从栈顶进栈)
已知入栈的序列是1~N的一个排列,请你判断出栈序列能否
是1,2,3,… N?
输入格式
输入包含多组数据。
输入第一行包含一个整数T, 代表测试数据的组数。
以下每组数据占据2行。
第一行包含一个整数N。
第二行包含N个整数,整数中由空格隔开。表示入栈序列。
输出格式
对于每组数据输出YES或者NO,代表出栈序列能否是1, 2, 3… N.

样例输入
2
5
24135
5
43152
样例输出
YES
NO
数据规模和约定
对于30%的评测用例,1 <= N <= 10
对于80%的评测用例,1 <= N <= 10000
对于所有评测用例,1 <= N <= 100000,1 <= T <=10。

代码实现

参考至:
https://newcoder-glm.blog.csdn.net/article/details/115298195
public class _I {
	//其实这里开十个就够了 无所谓
	static int[] arr = new int[20];
	static int index = 0;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for (int i = 0; i < T; i++) {
			int N = sc.nextInt();
			int[] a = new int[N];
			for (int j = 0; j < N; j++) a[j] = sc.nextInt();
			//创建一个队列
			Deque<Integer> deque = new ArrayDeque<>();
			int p = 1;
			for (int j = 0; j < N; j++) {
				deque.add(a[j]);
				if (a[j] == p) {
					deque.pollLast();
					p++;
				}
				while (!deque.isEmpty() && p == deque.peekFirst()) {
					deque.pollFirst();
					p++;
				}
				while (!deque.isEmpty() && p == deque.peekLast()) {
					deque.pollLast();
					p++;
				}
			}
			if (p == N + 1) arr[index++] = 1;
		}
		for (int i = 0; i < T; i++) {
			if (arr[i] == 1) System.out.println(true);
			else System.out.println(false);
		}
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值