第十二届蓝桥杯 2021年省赛真题 (Java 大学B组) 第一场 (更新中)
Posted 肖有量
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二届蓝桥杯 2021年省赛真题 (Java 大学B组) 第一场 (更新中)相关的知识,希望对你有一定的参考价值。
蓝桥杯 2021年省赛真题 (Java 大学B组 )
Placeholder
#A ASC
本题总分:5 分
问题描述
已知大写字母 A A A 的 A S C I I ASCII ASCII 码为 65 65 65,请问大写字母 L L L 的 A S C I I ASCII ASCII 码是多少?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
76
calcCode:
public class Test {
public static void main(String[] args) { new Test().run(); }
void run() {
// System.out.println(65 + 'L' - 'A');
System.out.println((int)'L');
}
}
麻烦签到题写的认真一点,谢谢。
#B 卡片
本题总分:5 分
问题描述
小蓝有很多数字卡片,每张卡片上都是数字
0
0
0 到
9
9
9。
小蓝准备用这些卡片来拼一些数,他想从
1
1
1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从
1
1
1 拼到多少。
例如,当小蓝有
30
30
30 张卡片,其中
0
0
0 到
9
9
9 各
3
3
3 张,则小蓝可以拼出
1
1
1 到
10
10
10,但是拼
11
11
11 时卡片
1
1
1 已经只有一张了,不够拼出
11
11
11。
现在小蓝手里有
0
0
0 到
9
9
9 的卡片各
2021
2021
2021 张,共
20210
20210
20210 张,请问小蓝可以从
1
1
1 拼到多少?
提示:建议使用计算机编程解决问题。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
3181
朴素解法
public class Test {
public static void main(String[] args) { new Test().run(); }
void run() { System.out.println(calc(2021)); }
int calc(int upper) {
int[] count = new int[10];
for (int n = 1, k = 1; ; k = ++n)
do
if (++count[k % 10] > upper)
return n - 1;
while ((k /= 10) > 0);
}
}
没什么好说的。
弯道超车
观察 [ 1 , 9 ] [1,9] [1,9] 这个区间中, [ 0 , 9 ] [0,9] [0,9] 的出现情况。
在 [ 1 , 9 ] [1,9] [1,9] 中, 1 1 1 至 9 9 9 各出现 1 1 1 次。
把观察的范围扩大到 [ 1 , 99 ] [1,99] [1,99],十位的 1 1 1 出现 [ 10 , 19 ] [10,19] [10,19] 共 10 10 10 次,十位的 2 2 2 出现 [ 20 , 29 ] [20,29] [20,29] 共 10 10 10 次, ⋯ \\cdots ⋯ ,十位的 9 9 9 出现 [ 90 , 99 ] [90,99] [90,99] 共 10 10 10 次,低位 [ 0 , 9 ] [0,9] [0,9] 重复出现 10 10 10 次, 1 1 1 至 9 9 9 各出现 20 20 20 次, 0 0 0 出现 9 9 9 次。
将这个观察范围继续扩大,会发现 1 1 1 的使用次数总是不小于 0 0 0 、 2 2 2 至 9 9 9,也就是说统计 0 0 0 、 2 2 2 至 9 9 9 是没有意义的。
public class Test {
public static void main(String[] args) { new Test().run(); }
void run() { System.out.println(calc(2021)); }
int calc(int upper) {
int count = 0;
for (int n = 1, k = 1; ; k = ++n) {
do
if (k % 10 == 1) count++;
while ((k /= 10) > 0);
if (count >= upper)
return count == upper ? n : n - 1;
}
}
}
#C 直线
本题总分:10 分
问题描述
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。
给定平面上
2
×
3
2 × 3
2×3 个整点
{
(
x
,
y
)
∣
0
≤
x
<
2
,
0
≤
y
<
3
,
x
∈
Z
,
y
∈
Z
}
\\{(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z\\}
{(x,y)∣0≤x<2,0≤y<3,x∈Z,y∈Z},即横坐标是
0
0
0 到
1
1
1 (包含
0
0
0 和
1
1
1) 之间的整数、纵坐标是
0
0
0 到
2
2
2 (包含
0
0
0 和
2
2
2) 之间的整数的点。这些点一共确定了
11
11
11 条不同的直线。
给定平面上
20
×
21
20 × 21
20×21 个整点
{
(
x
,
y
)
∣
0
≤
x
<
20
,
0
≤
y
<
21
,
x
∈
Z
,
y
∈
Z
}
\\{(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z\\}
{(x,y)∣0≤x<20,0≤y<21,x∈Z,y∈Z},即横坐标是
0
0
0 到
19
19
19 (包含
0
0
0 和
19
19
19) 之间的整数、纵坐标是
0
0
0 到
20
20
20 (包含
0
0
0 和
20
20
20) 之间的整数的点。请问这些点一共确定了多少条不同的直线。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
40257
直线方程集合
一种朴素的想法,是将所有点连接起来,去掉重复的线,然后统计。
为了方便表示,这里采用斜截式方程 y = k x + b y=kx+b y=kx+b 来表示每一条直线,其中 k k k 为直线斜率, b b b 为直线在 y y y 轴上的截距,并统一不处理斜率不存在的线,将结果加上一个 20 20 20。
注意! 这段程序的结果是不准确的。
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) { new Test().run(); }
int X = 20, Y = 21;
void run() {
Set<Line> set = new HashSet();
for (int x1 = 0; x1 < X; x1++)
for (int y1 = 0; y1 < Y; y1++)
for (int x2 = x1; x2 < X; x2++)
for (double y2 = 0; y2 < Y; y2++)
if (x1 != x2){
double k = (y2 - y1) / (x2 - x1);
double b = -x1 * k + y1;
set.add(new Line(k, b));
}
System.out.println(set.size() + X);
}
class Line {
double k, b;
Line(double b, double k) {
this.k = k;
this.b = b;
}
@Override
public boolean equals(Object obj) {
return k == ((Line)obj).k && b == ((Line)obj).b;
}
@Override
public int hashCode() {
return (int)k ^ (int)以上是关于第十二届蓝桥杯 2021年省赛真题 (Java 大学B组) 第一场 (更新中)的主要内容,如果未能解决你的问题,请参考以下文章
第十二届蓝桥杯省赛第二场C++B组 真题题解(详细讲解+代码分析)看这篇就够了~~~
《蓝桥杯真题》:2021单片机省赛第二场(第十二届第二场)暨第十三届蓝桥杯赛前模拟试题