蓝桥杯模拟题
1.世纪末的星期–日期问题
import java.util.Calendar;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Calendar ca=Calendar.getInstance();//创建一个指定日期的对象
for(int i=1999;i<100000;i+=100) {//枚举1999之后的世纪
ca.set(i, 11, 31);//Calendar类对象信息的设置,从0开始,12月是11
if(ca.get(Calendar.DAY_OF_WEEK)==1){//判断获取的这一天是否是周日,记周日为1,周一为2,以此类推
System.out.println(i);
break;
}
}
}
}
2.马虎的算式
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int a,b,c,d,e;
int ret=0;
for(a=1;a<=9;a++) {
for(b=1;b<=9;b++) {
for(c=1;c<=9;c++) {
for(d=1;d<=9;d++) {
for(e=1;e<=9;e++) {
if(a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e) {//各不相等
if(((a*10+b)*(c*100+d*10+e))==((a*100+d*10+b)*(c*10+e))){
ret++;
}
}
}
}
}
}
}
System.out.println(ret);
}
}
3.振兴中华
import java.util.Calendar;
import java.util.Scanner;
public class Main {
static int lujing(int x,int y) {
if(x==3||y==4) {//在第三行上或第四列上就只有一种走法,
//此时既不能向下走,也不能向右走,递归出口
return 1;
}
return lujing(x+1,y)+lujing(x,y+1);//向下及向右的方法相加
}
public static void main(String[] args) {
int res=lujing(0,0);
System.out.println(res);
}
}
4.上台阶
import java.util.Calendar;
import java.util.Scanner;
public class Main {
static int a[]= {0,1,2,1,1,1,1,5,5,4,-1,-1,-2,-3,-1,-9};
static int mm=0x3f3f3f3f;
static int dfs(int idx,int k) {//idx表示所在位置台阶数,k表示不超过6步
if(idx==15) {
return -9;
}
if(k==6) {
return -mm;
}
int res=-mm;//表示得分
for(int i=1;i<=4&&idx+i<=15;i++) {//每次最多4步并且最终位置是小于15,不可能超过15
res=Math.max(res, dfs(idx+i,k+1));//每走一次步数+1
}
return res+a[idx];
}
public static void main(String[] args) {
System.out.println(dfs(0,0));
}
}
5.递增三元组
import java.util.Calendar;
import java.util.Scanner;
public class Main {
static int a[]= {2,9,17,4,14,10,25,26,11,14,16,17,14,21,16,27,32,20,26,36};
public static void main(String[] args) {
int res=0;
int n=a.length;
for(int i=0;i<n-2;i++) {
for(int j=i+1;j<n-1;j++) {
for(int k=j+1;k<n;k++) {
if(a[i]<a[j]&&a[j]<a[k]) {
res++;
}
}
}
}
System.out.println(res);
}
}
十三期-模拟题
题1
小蓝的IP地址为 192.168.*.21,其中 * 是一个数字,请问这个数字最大可能是多少 ?
答案:255
题2
如果一个整数 g 能同时整除整数 A 和 B,则称 g 是 A 和 B 的公约数。例如:43 是 86 和 2021 的公约数。
请问在 1(含) 到 2021(含) 中,有多少个数与 2021 存在大于 1 的公约数。请注意 2021 和 2021 有大于 1 的公约数,因此在计算的时候要算一个。
答案:89
import java.util.Scanner;
public class Main {
//公约数
static int gcd(int a,int b) {
return b>0?gcd(b,a%b):a;
}
public static void main(String[] args) {
int res=0;
for(int i=1;i<=2021;i++) {
if(gcd(i,2021)>1) {
res++;
}
}
System.out.println(res);
}
}
题3
如果一个整数 M 同时是整数 A 和 B 的倍数,则称 M 是 A 和 B 的公倍数,公倍数中最小的一个正整数称为最小公倍数。
例如:2021 和 86 的最小公倍数是 4042.
请问在 1(含) 到 2021(含) 中,有多少个数与 2021 的最小公倍数是 4042。
答案:3
import java.util.Scanner;
public class Main {
static int gcd(int a,int b) {
return b>0?gcd(b,a%b):a;
}
public static void main(String[] args) {
int res=0;
for(int i=1;i<=2021;i++) {//公倍数
if(i*2021/gcd(i,2021)==4042) {
res++;
}
}
System.out.println(res);
}
}
题4
10 是一个非常特殊的数,它可以表示成两个非负整数的平方和,10 = 3 * 3 + 1 * 1。
9 也是同样特殊的数,它可以表示成 9 = 3 * 3 + 0 * 0。
请问,在 1 到 2021 中有多少个这样的数?
请注意,有的数有多种表示方法,例如 25 = 5 * 5 + 0 * 0 = 3 * 3 + 4 * 4,在算答案时只算一次。
答案 :1632
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int res=0;
for(int i=0;i<=2021;i++) {
for(int j=0;j<=2021;j++) {
for(int k=0;k<=2021;k++) {
if(i*i+j*j==k)res++;
}
}
}
System.out.println(res);
}
}
题5
下面是一个2020的矩阵,矩阵中的每个数字是一个1到9之间的数字,请注意显示时去除了分隔符号。
69859241839387868941
17615876963131759284
37347348326627483485
53671256556167864743
16121686927432329479
13547413349962773447
27979945929848824687
53776983346838791379
56493421365365717745
21924379293872611382
93919353216243561277
54296144763969257788
96233972513794732933
81443494533129939975
61171882988877593499
61216868895721348522
55485345959294726896
32124963318242554922
13593647191934272696
56436895944919899246
矩阵中一个子矩阵的值是指子矩阵中所有数值的和。
请问,矩阵中值最大的一个55的子矩阵的值是多少?
答案: 154
import java.util.Scanner;
public class Main {
static int n=20;
static int s[][]=new int [n+1][n+1];
static int res=0;
static int sum(int i,int j) {//求子矩阵的和
return s[i][j]-s[i-5][j]-s[i][j-5]+s[i-5][j-5];
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
for(int i=1;i<n;i++) {//这里注意数组越界
String ss =sc.next();//一行字符串的输入
for(int j=1;j<n;j++) {
s[i][j]=ss.charAt(j)-'0';//二维数组的数值输入
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];//计算二维前缀和
//s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+s[i][j];
}
}
for(int i=5;i<n;i++) {//注意5*5的子矩阵,至少5行5列,且i一定不会是最后一行
for(int j=5;j<=n;j++) {
res=Math.max(sum(i, j),res);//所有5*5的子矩阵取最大的和
}
}
System.out.println(res);
}
}
题6
小蓝要写一个网页显示一些商品。
商品总共有 t 个,按顺序由 1 到 t 编号,每页显示 a 个,请问第 p 页显示的最小和最大编号是多少?
【输入格式】
输入一行包含三个整数 t、a、p,相邻整数之间用一个空格分隔。
【输出格式】
输出一行包含两个整数,分别表示最小和最大编号。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
int a=sc.nextInt();
int p=sc.nextInt();
int res=(p-1)*a+1;
System.out.println(res+" "+Math.max(t, a*p));
}
}
题7
哈弗曼树求编码长度
https://blog.csdn.net/qq_44867340/article/details/119455799
题8
给定一个正整数 n,请判断 n 的所有数位上的值是否从左到右是严格递增的。
例如:1589 是严格递增的 。
再如:1336 不是严格递增的,中间有相同的 3。
再如:1598 不是严格递增的。
【输入格式】
输入一行包含一个正整数 n。
【输出格式】
如果是严格递增的,输出“YES”(全大写),否则输出“NO”(全大写)。
【样例输入】
1589
【样例输出】
YES
【样例输入】
1336
【样例输出】
NO
【评测用例规模与约定】
对于所有评测用例,1 <= n <= 1000000000。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.next();
int cnt=0;
for(int i=0;i+1<s.length();i++) {
if((s.charAt(i)-'0')<(s.charAt(i+1)-'0')) {
cnt++;
}
}
if(cnt==s.length()-1) {
System.out.println("YES");
}else {
System.out.println("NO");
}
}
}
题9
有 n 个人要排列成一个 k 行 k 列的方阵,请问 k 最大是多少?
输入格式
输入一行包含一个整数 n。
输出格式
输出一行包含一个整数,表示答案。
样例输入
15
样例输出
3
样例输入
81
样例输出
9
评测用例规模与约定
对于 50% 的评测用例,2 <= n <= 1000。
对于所有评测用例,2 <= n <= 100000000。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println((int)Math.sqrt(n));
}
}
題10
问题描述
一个 1 到 n 的排列被称为半递增序列,是指排列中的奇数位置上的值单调递增,偶数位置上的值也单调递增。
例如:(1, 2, 4, 3, 5, 7, 6, 8, 9) 是一个半递增序列,因为它的奇数位置上的值是 1, 4, 5, 6, 9,单调递增,偶数位置上的值是 2, 3, 7, 8,也是单调递增。
请问,1 到 n 的排列中有多少个半递增序列?
输入格式
输入一行包含一个正整数 n。
输出格式
输出一行包含一个整数,表示答案,答案可能很大,请输出答案除以 1000000007 的余数。
样例输入
5
样例输出
10
样例说明
有以下半递增序列:
(1, 2, 3, 4, 5)
(1, 2, 3, 5, 4)
(1, 2, 4, 3, 5)
(1, 3, 2, 4, 5)
(1, 3, 2, 5, 4)
(1, 4, 2, 5, 3)
(2, 1, 3, 4, 5)
(2, 1, 3, 5, 4)
(2, 1, 4, 3, 5)
(3, 1, 4, 2, 5)
评测用例规模与约定
对于 50% 的评测用例,2 <= n <= 20。
对于所有评测用例,2 <= n <= 1000。
题解:排列组合问题,假设100个数,奇数50个递增,其余50个偶数必定递增且唯一,因为只剩50个数且需要满足递增,齐数与偶数分别传入不同的参数,进行取余计算
import java.util.Scanner;
public class Main {
static int N = (int) 1e9 + 7;
static long c(long a, long b) {
long cnt = 1;
for (long i = 1, j = a; i <= b; i++, j--) {
cnt = cnt * (j / i) % N;
}
return cnt;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
if (n % 2 == 0) {
System.out.println(c(n, n / 2));
} else {
System.out.println(c(n, (n + 1) / 2));
}
}
}
1 秒=1000 毫秒
题11停车时间
【问题描述】
小蓝将自己的车停在路边,在同一天将车开走。给定停车时间和开走时间,请问小蓝停了多长时间?
【输入格式】
输入两行,第一行包含停车时间,第二行包含开走时间。
每个时间的格式为 HH:MM:SS,其中 HH 表示时,值为 0 到 23 的整数,如果小于 10 用 0 补齐两位;MM 和 SS 分别表示分和秒,值为 0 到 59 的整数,小于 10 时用 0 补齐两位。
【输出格式】
输出总共停车的时间,格式为 HH:MM:SS。
【样例输入】
08:58:10
17:20:31
【样例输出】
08:22:21
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader brBufferedReader=new BufferedReader(new InputStreamReader(System.in));
String string[]= brBufferedReader.readLine().split(":");
String string2[]=brBufferedReader.readLine().split(":");
int h1=Integer.parseInt(string[0]);
int m1=Integer.parseInt(string[1]);
int s1=Integer.parseInt(string[2]);
int h2=Integer.parseInt(string2[0]);
int m2=Integer.parseInt(string2[1]);
int s2=Integer.parseInt(string2[2]);
int time=(h2*3600+m2*60+s2)-(h1*3600+m1*60+s1);
System.out.printf("%02d:%02d:%02d\n",time/3600,time%3600/60,time%60);
}
}