目录
第 1 题:裁纸刀
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有一个裁纸刀,每次可以将一张纸沿一条直线裁成两半。
小蓝用一张纸打印出两行三列共 6 个二维码,至少使用九次裁出来,下图给出了一种裁法。
在上面的例子中,小蓝的打印机没办法打印到边缘,所以边缘至少要裁 4 次。另外,小蓝每次只能裁一张纸,不能重叠或者拼起来裁。
如果小蓝要用一张纸打印出 20 行 22 列共 440 个二维码,他至少需要裁多少次?
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
代码:
找规律,可以一次性剪一行,但是列的话只能一个一个减!!
n行m列
按行剪:n-1
按列剪:(m-1)*n
周边剪:4
package 第十四届蓝桥杯三月真题刷题训练.day10;
import java.io.*;
/**
* @author yx
* @date 2023-03-13 8:37
*/
public class 裁纸刀 {
static PrintWriter out =new PrintWriter(System.out);
static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in=new StreamTokenizer(ins);
/**
* 输入
* in.nextToken()
* int a= (int)in.nval;
*
* 输出
* out.print();
* out.flush();
*/
public static void main(String[] args) throws IOException {
in.nextToken();
int n=(int)in.nval;
in.nextToken();
int m=(int)in.nval;
//找规律
System.out.println((n-1)+(n)*(m-1)+4);
}
}
第 2 题:刷题统计
问题描述
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题?
输入格式
输入一行包含三个整数 a,b 和 n.
输出格式
输出一个整数代表天数。
样例输入
10 20 99
样例输出
8
评测用例规模与约定
对于 50% 的评测用例, 1≤a,b,n≤10^6
对于 100% 的评测用例, 1≤a,b,n≤10^18
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
代码:
package 第十四届蓝桥杯三月真题刷题训练.day10;
import java.io.*;
import java.util.Scanner;
/**
* @author yx
* @date 2023-03-13 8:52
*/
public class 刷题统计_long {
static PrintWriter out =new PrintWriter(System.out);
static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in=new StreamTokenizer(ins);
/**
* 输入
* in.nextToken()
* int a= (int)in.nval;
*
* 输出
* out.print();
* out.flush();
*/
//十年IO一场空不开longlong见祖宗
public static void main(String[] args) throws IOException {
// in.nextToken();
// long a=(long) in.nval;
// in.nextToken();
// long b=(long) in.nval;
// in.nextToken();
// long n=(long) in.nval;
Scanner scanner = new Scanner(System.in);
long a=scanner.nextLong();
long b=scanner.nextLong();
long n=scanner.nextLong();
long day=0;
long temp=n%(5*a+2*b);
long temp2=0;
day=n/(5*a+2*b)*7;
// if(temp!=0) {
// if(temp<=5*a){
// if(temp%a!=0){
// day+=(temp/a+1);
// }else {
// day+=temp/a;
// }
// }else {
// day+=5;
// temp-=5*a;
// if(temp-b<=0){
// day+=1;
// }else {
// day+=2;
// }
// }
// }
long[] nums=new long[]{a,a,a,a,a,b,b};
int i=0;
if(temp!=0){
while (true){
temp2+=nums[i];
day++;
i++;
if(temp2>=temp){
out.println(day);
out.flush();
return;
}
}
}else {
out.println(day);
out.flush();
}
// out.flush();
}
}
第 3 题:修建灌木
问题描述
爱丽丝要完成一项修剪灌木的工作。
有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。
灌木每天从早上到傍晩会长高 1 厘米, 而其余时间不会长高。在第一天的 早晨, 所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
输入格式
一个正整数 N, 含义如题面所述。
输出格式
输出 N 行, 每行一个整数, 第 i 行表示从左到右第 i 棵树最高能长到多高。
样例输入
3
样例输出
4 2 4
评测用例规模与约定
对于 30% 的数据, N≤10.
对于 100% 的数据, 1<N≤10000.
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
代码:
找规律,画个图就能理解,So easy!!
package 第十四届蓝桥杯三月真题刷题训练.day10;
import java.io.*;
/**
* @author yx
* @date 2023-03-13 9:51
*/
public class 修剪灌木 {
static PrintWriter out =new PrintWriter(System.out);
static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in=new StreamTokenizer(ins);
/**
* 输入
* in.nextToken()
* int a= (int)in.nval;
*
* 输出
* out.print();
* out.flush();
*/
public static void main(String[] args) throws IOException {
in.nextToken();
int N=(int) in.nval;
for (int i = 1; i <= N; i++) {
out.println(Math.max((N-i)*2,(i-1)*2));
}
out.flush();
}
}
第 4 题:k倍区间(朴素版)
题目描述
给定一个长度为 N 的数列,A1,A2,⋯AN,如果其中一段连续的子序列 Ai,Ai+1,⋯Aj( i≤ji≤j ) 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。
你能求出数列中总共有多少个 K 倍区间吗?
输入描述
第一行包含两个整数 N 和 K( 1≤N,K≤10^5 )。
以下 N 行每行包含一个整数 AiAi ( 1≤Ai≤10^5 )
输出描述
输出一个整数,代表 K 倍区间的数目。
输入输出样例
示例
输入
5 2 1 2 3 4 5
输出
6
运行限制
- 最大运行时间:2s
- 最大运行内存: 256M
代码:
package 第十四届蓝桥杯三月真题刷题训练.day10;
import java.io.*;
import java.util.Scanner;
/**
* @author yx
* @date 2023-03-13 10:15
*/
public class k倍区间_同余定理_long类型转换 {
static PrintWriter out =new PrintWriter(System.out);
static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in=new StreamTokenizer(ins);
/**
* 输入
* in.nextToken()
* int a= (int)in.nval;
*
* 输出
* out.print();
* out.flush();
*/
public static void main(String[] args) throws IOException {
// in.nextToken();
// int N=(int) in.nval;
// in.nextToken();
// int K=(int) in.nval;
Scanner scanner = new Scanner(System.in);
int N=scanner.nextInt();
int K=scanner.nextInt();
long ans=0;
long[] nums=new long[K];//存余数的数组
long sum=0;
int temp=0;
for (int i = 0; i < N; i++) {
temp=scanner.nextInt();
sum+=temp;
/*
sum%K 不加阔号会显示段错误
*/
// nums[(int) sum%K]++;
nums[(int) (sum%K)]++;
}
//余数为0的可以自己单独构成一个K倍区间
ans+=nums[0];
/*
有x个前缀和相同的一个余数,一共能构成x(x-1)/2个K倍数区间
K=5
注意:这里的Xi指的是前i个总和
X1=3;
X2=8;
X3=13
K倍区间[X1,x2],[x1,x3],[x2,x3]
*/
for (int i = 0; i <K ; i++) {
ans+=((nums[i]-1)*nums[i])/2;
}
out.println(ans);
out.flush();
}
}