1.蓝桥杯(Java) -day01
2.蓝桥杯(Java) -day02
3.蓝桥杯(Java) -day03
4.蓝桥杯(Java) -day04
一、裁纸刀
蓝桥杯-2023省赛模拟题-裁纸刀
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有一个裁纸刀,每次可以将一张纸沿一条直线裁成两半。
小蓝用一张纸打印出两行三列共 6 个二维码,至少使用九次裁出来,下图给出了一种裁法。
图片描述
在上面的例子中,小蓝的打印机没办法打印到边缘,所以边缘至少要裁 4 次。另外,小蓝每次只能裁一张纸,不能重叠或者拼起来裁。
如果小蓝要用一张纸打印出 20 行 22 列共 440 个二维码,他至少需要裁多少次?
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解题思路
裁剪次数=4+二维码个数-1
解题代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
System.out.println(443);
}
}
二、求和
蓝桥杯-2023省赛模拟题-求和
问题描述
给定 n 个整数 ,求它们两两相乘再相加的和,即:
输入格式
输入的第一行包含一个整数 n。
输出格式
输出一个整数 SS,表示所求的和。请使用合适的数据类型进行运算。
样例输入
4
1 3 6 9
样例输出
117
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
解题思路
先求出前缀和,并存放在另一个数组中
a[i]乘以前缀和S[n]-S[i]
解题代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n+1];
long[] sum=new long[n+1];
for (int i = 1; i <=n; i++) {
a[i] = sc.nextInt();
sum[i]=sum[i-1]+a[i];
}
long res = 0;
for (int i = 1; i <= n; i++) {
res+=a[i]*(sum[n]-sum[i]);
}
System.out.println(res);
}
}
三、排列字母
蓝桥杯-2023省赛模拟题-排列字母
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要把一个字符串中的字母按其在字母表中的顺序排列。
例如,LANQIAO 排列后为 AAILNOQ。
又如,GOODGOODSTUDYDAYDAYUP 排列后为 AADDDDDGGOOOOPSTUUYYY。
请问对于以下字符串,排列之后字符串是什么?
WHERETHEREISAWILLTHEREISAWAY
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
解题代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
char[] str=sc.nextLine().toCharArray();
Arrays.sort(str);
for(char c:str) {
System.out.print(c);
}
}
}
四、刷题统计
问题描述
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 aa 道题目, 周六和周日每天做 bb 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 nn 题?
输入格式
输入一行包含三个整数 a, ba,b 和 nn.
输出格式
输出一个整数代表天数。
样例输入
10 20 99
样例输出
8
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解题思路
这个题看着简单,暴力就超时
可以直接算用了多少整周
剩下的进行判断
最后加上整周的所有天数
解题代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
long a=sc.nextLong();
long b=sc.nextLong();
long n=sc.nextLong();
long res=0;
long week=5*a+2*b;
long time=n/week; //多少周
long other=n%week;
if(other==0) {
System.out.println(7*time);
return;
}
for(long i=1;;i++) {
if(i%7==0||i%7==6) {
res+=b;
}else {
res+=a;
}
if(res>=other) {
System.out.println(i+7*time);
return;
}
}
}
}
五、修剪灌木
蓝桥杯-2023省赛模拟题-修剪灌木
问题描述
爱丽丝要完成一项修剪灌木的工作。
有 NN 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。
灌木每天从早上到傍晩会长高 1 厘米, 而其余时间不会长高。在第一天的 早晨, 所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
输入格式
一个正整数 NN, 含义如题面所述。
输出格式
输出 NN 行, 每行一个整数, 第 ii 行表示从左到右第 ii 棵树最高能长到多高。
样例输入
3
样例输出
4
2
4
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
解题思路
看对应点的两边长度*2
解题代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a=new int[n];
for(int i=0;i<n;i++) {
a[i]=2*Math.max(n-i-1,i);
System.out.println(a[i]);
}
}
}
六. 顺子日期
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。
例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个顺子日期,它一个顺子也没有。
小明想知道在整个 2022 年份中,一共有多少个顺子日期?
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
解题思路
知道还有其他的方法,但是记不住 一直用Calendar
这里需要注意Calendar的月份和天数 都是单数 ,格式不是yyyyMMdd, 所以用SimpleDateFormat 转化格式
其次 要注意 MM一定是大写 应为分钟是小写mm
解题代码
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Calendar date = Calendar.getInstance();
date.set(2022, 0, 1);
String[] str = { "012", "123", "234", "345", "456", "567", "678", "789" };
int count = 0;
while(date.get(Calendar.YEAR)==2022) {
SimpleDateFormat form=new SimpleDateFormat("yyyyMMdd");
String time=form.format(date.getTime());
for(String s: str) {
if(time.contains(s)) {
count++;
break;
}
}
date.add(Calendar.DATE,1);
}
System.out.println(count);
}
}
七. 纸张尺寸
问题描述
在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm \times× 841mm, 将 A0 纸 沿长边对折后为 A1 纸, 大小为 841mm \times× 594mm, 在对折的过程中长度直接取 下整 (实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸, 依此类推。
输入纸张的名称, 请输出纸张的大小。
输入格式
输入一行包含一个字符串表示纸张的名称, 该名称一定是 A0、A1、A2、 A3、A4、A5、A6、A7、A8、A9 之一。
输出格式
输出两行,每行包含一个整数,依次表示长边和短边的长度。
样例输入1
A0
样例输出1
1189
841
解题思路
n为几就是循环几次
对长边除以2,然后长短进行交换
解题代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String str=sc.next();
int n=Integer.parseInt(str.substring(1));
int length=1189;
int width=841;
for(int i=0;i<n;i++) {
int temp=Math.max(length,width)/2;
length=width;
width=temp;
}
System.out.println(length);
System.out.println(width);
}
}