第十四届蓝桥杯三月真题刷题训练——第 12 天
Posted 小羊不会飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十四届蓝桥杯三月真题刷题训练——第 12 天相关的知识,希望对你有一定的参考价值。
目录
第 1 题:0的个数
问题描述
给定一个正整数 n ,请问 n 的十进制表示中末尾总共有几个 0 ?
输入格式
输入一行包含一个正整数 nn。
输出格式
输出一个整数,表示答案。
样例输入
20220000
样例输出
4
评测用例规模与约定
对于所有评测用例,1 <= n <= 1000000000。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
代码:
package 第十四届蓝桥杯三月真题刷题训练.day12;
import java.io.*;
/**
* @author yx
* @date 2023-03-15 8:19
*/
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;
int temp=0;
int ans=0;
while (true)
temp=n%10;
if(temp!=0)
break;
else
ans++;
n/=10;
out.println(ans);
out.flush();
第 2 题:超级质数
问题描述
如果一个质数 P 的每位数字都是质数, 而且每两个相邻的数字组成的两位 数是质数, 而且每三位相邻的数字组成的三位数是质数, 依次类推, 如果每相 邻的 k 位数字组成的 k 位数都是质数, 则 P 称为超级质数。
如果把超级质数 P 看成一个字符串, 则这个超级质数的每个子串都是质 数。
例如, 53 是一个超级质数。
请问, 最大的超级质数是多少?
答案提交
这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
代码:
package 第十四届蓝桥杯三月真题刷题训练.day12;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
/**
* @author yx
* @date 2023-03-15 15:10
*/
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)
for (int i = 1000000; i>=2 ; i--)
if(isCheck(i))
System.out.println(i);
return;
static boolean isCheck(int n)
String s=n+"";
int length=s.length();
for (int i = 0; i < length ; i++)
for (int j = i+1; j <= length ; j++)
int temp=Integer.parseInt(s.substring(i,j));
if(!isPrime(temp))//如果不是质数就返回false
return false;
return true;
static boolean isPrime(int n)
if(n==1)return false;
for (int i = 2; i <= Math.sqrt(n) ; i++)
if(n%i==0)
return false;
return true;
分析:
思路:
1、质数判断
2、数值切割
第 3 题:卡牌_二分_快读
问题描述
这天, 小明在整理他的卡牌。
他一共有 n 种卡牌, 第 i 种卡牌上印有正整数数 i(i∈[1,n]), 且第 i 种卡牌 现有 ai 张。
而如果有 n 张卡牌, 其中每种卡牌各一张, 那么这 nn 张卡牌可以被称为一 套牌。小明为了凑出尽可能多套牌, 拿出了 m 张空白牌, 他可以在上面写上数 i, 将其当做第 i 种牌来凑出套牌。然而小明觉得手写的牌不太美观, 决定第 ii 种牌最多手写 bi 张。
请问小明最多能凑出多少套牌?
输入格式
输入共 3 行, 第一行为两个正整数 n,m。
第二行为 n 个正整数 a1,a2,…,an。
第三行为 n 个正整数 b1,b2,…,bn 。
输出格式
一行, 一个整数表示答案。
样例输入
4 5 1 2 3 4 5 5 5 5
样例输出
3
样例说明
这 5 张空白牌中, 拿 2 张写 1 , 拿 1 张写 2 , 这样每种牌的牌数就变为了 3,3,3,4, 可以凑出 3 套牌, 剩下 2 张空白牌不能再帮助小明凑出一套。
评测用例规模与约定
对于 30%的数据, 保证 n≤2000;
对于 100% 的数据, 保证 n≤2×10^5;ai,bi≤2*n;m≤n^2 。
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
代码:
package 第十四届蓝桥杯三月真题刷题训练.day12;
import java.io.*;
import java.util.Scanner;
/**
* @author yx
* @date 2023-03-15 16:45
*/
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();
*/
static int[]a;
static int[]b;
static int n;
static long m;
public static void main(String[] args) throws IOException
String[] s=ins.readLine().split(" ");
n=Integer.parseInt(s[0]);
m=Long.parseLong(s[1]);
a=new int[n];
b=new int[n];
String[] s2=ins.readLine().split(" ");
for (int i = 0; i < n; i++)
a[i]=Integer.parseInt(s2[i]);
String[] s3=ins.readLine().split(" ");
for (int i = 0; i < n; i++)
b[i]=Integer.parseInt(s3[i]);
int l=0;
int r=2*n;
int ans=0;
while (l<=r)
int mid=(l+r)/2;
if(check(mid))
ans=mid;
l=mid+1;
else
r=mid-1;
out.println(ans);
out.flush();
static boolean check(int t)
long temp=m;//记录空白卡牌
for (int i = 0; i < n; i++)
if(a[i]>=t)continue;
if(b[i]+a[i]<t)return false;
if(temp+a[i]<t)return false;
if(t-a[i]<=temp)
temp-=(t-a[i]);
else
return false;
return true;
分析:
这道题目非常综合,考察了二分以及Java的IO流输入输出,下面是我总结的一些要点!
(1)这道题目是通过二分的手段来找到最多的能凑到的牌的套数
我自己的一套二分模板(经供参考):
while (l<=r) int mid=(l+r)/2; if(check(mid)) ans=mid; l=mid+1; else r=mid-1;
二分的难点有两个:
- 二分边界,即L和R的退出条件
- check函数的函数体实现
(2)这道题目充分的体现了Java的不足,普通的Scanner输入只能拿到30%的分数,这道题目要想拿满分必须要使用Java的I/O流输入
下面是我的题解代码中每次都会出现的IO流模板:
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(); */
(3)在做这道题目的时候,我发现Scanner和BufferReader不能同时使用,会出现输入异常,这个点希望大家在做题的时候注意一下!!
第 4 题:染色时间
拍了一天戏,脑袋晕晕的,下次补!
第十四届蓝桥杯三月真题刷题训练——第 8 天
目录
第 1 题:分数
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
1/1+1/2+1/4+1/8+⋯
每项是前一项的一半,如果一共有 20 项,求这个和是多少,结果用分数表示出来。
类似:3/2,当然,这只是加了前 2 项而已。分子分母要求互质。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
代码:
package 第十四届蓝桥杯三月真题刷题训练.day8;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
/**
* @author yx
* @date 2023-03-11 12:09
*/
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)
/*
等比数列公式
Sn=a1*(1-q^n)/(1-q)
按题目意思,a1=1,n=20,q=1/2
带入得到:
Sn=(2^n-1)/2^(n-1)
*/
out.println((int) Math.pow(2,20)-1+"/"+(int) Math.pow(2,19));
out.flush();
第 2 题:回文日期
题目描述
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入描述
输入包含一个八位整数 NN,表示日期。
对于所有评测用例,10000101≤N≤89991231,保证 N 是一个合法日期的 8 位数表示。
输出描述
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
输入输出样例
示例
输入
20200202
输出
20211202 21211212
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
代码:
我这题为了偷懒少考虑了一些情况的(闰年和每个月份对应的日子是不同的)
oj居然没检测出来,哈哈哈!!
package 第十四届蓝桥杯三月真题刷题训练.day8;
import java.io.*;
/**
* @author yx
* @date 2023-03-11 12:18
*/
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;
boolean huiWen=false;
boolean aB=false;
while (true)
n++;
if(isHeFa(n))
if(isHuiWem(n)&&!huiWen)
out.println(n);
huiWen=true;
if(isAB(n))
out.println(n);
out.flush();
return;
static boolean isHuiWem(int n)
char[] arr=(n+"").toCharArray();
int l=0;
int r=7;
while (l<=r)
if(arr[l]!=arr[r])return false;
l++;
r--;
return true;
static boolean isAB(int n)
char[] arr=(n+"").toCharArray();
if(arr[0]==arr[2]&&arr[0]==arr[5]&&arr[0]==arr[7]&&arr[1]==arr[3]&&arr[1]==arr[4]&&arr[1]==arr[6])
return true;
return false;
static boolean isHeFa(int n)
String s= n+"";
/**
* 下面的日期判断都是渣渣
*/
if(Integer.parseInt(s.substring(4,6))>=1&&Integer.parseInt(s.substring(4,6))<=12)
// if(isRunYear(Integer.parseInt(s.substring(0,4)))&&Integer.parseInt(s.substring(4,6))==2)
// if(Integer.parseInt(s.substring(6,8))>=1&&Integer.parseInt(s.substring(6,8))<=29)
// return true;
//
//
if(Integer.parseInt(s.substring(6,8))>=1&&Integer.parseInt(s.substring(6,8))<=31)
return true;
return false;
// static boolean isRunYear(int n)
// int year=Integer.parseInt((n+"").substring(0,4));
// /*
// 闰年的两种情况:
// 1、100年整的只能被400整除
// 2、非100年整的只能被4整除,不能被100整除
// */
// if(year%400==0||(year%100!=0&&year%4==0))
// return true;
//
// return false;
//
第 3 题:迷宫
跑个步回来补题
代码:
以上是关于第十四届蓝桥杯三月真题刷题训练——第 12 天的主要内容,如果未能解决你的问题,请参考以下文章