十一届蓝桥杯第二场比赛java C组
- 试题 A: 约数个数
本题总分:5 分
【问题描述】
对于一个整数,能整除这个整数的数称为这个数的约数。
例如:1, 2, 3, 6 都是 6 的约数。
请问 78120 有多少个约数。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
public class Test01约数个数 {
public static void main(String[] args) {
int ans=0;
for(int i=1;i<=78120;i++) {
if(78120%i==0) {
ans++;
}
}
System.out.println(ans);
}
}
2、试题 B: 寻找 2020
本题总分:5 分
【问题描述】
小蓝有一个数字矩阵,里面只包含数字 0 和 2。小蓝很喜欢 2020,他想找 到这个数字矩阵中有多少个 2020 。
小蓝只关注三种构成 2020 的方式:
• 同一行里面连续四个字符从左到右构成 2020。
• 同一列里面连续四个字符从上到下构成 2020。
• 在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。
例如,对于下面的矩阵:
220000
000000
002202
000000
000022
002020
一共有 5 个 2020。其中 1 个是在同一行里的,1 个是在同一列里的,3 个 是斜线上的。
小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一 个文件里面,在试题目录下有一个文件 2020.txt,里面给出了小蓝的矩阵。
请帮助小蓝确定在他的矩阵中有多少个 2020。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
public class Test02寻找2020迭代 {
static int N=6;
static int[][] data= {
{2,2,0,0,0,0},
{0,0,0,0,0,0},
{0,0,2,2,0,2},
{0,0,0,0,0,0},
{0,0,0,0,2,2},
{0,0,2,0,2,0}};
static int []src = {2,0,2,0};//要找的数
static int dx[]= {1,0 ,1}; //三个方向
static int dy[]= {0,1, 1}; //
static int ans; //出现次数
public static void main(String[] args) {
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
if(data[i][j]==2) { //迭代入口
cheak(i,j);
}
}
}
System.out.println(ans);
}
private static void cheak(int x, int y) {
for(int k=0;k<3;k++) { //三个方向展开
int _x=x+dx[k];
int _y=y+dy[k];
int i=1; //凑齐四个的下标
while(_x>=0&&_x<N&&_y<N&&_y>=0&&data[_x][_y]==src[i]) {
if(i==3) { //如果找全2020,则ans 加1结束
ans++;
break;
}
i++; //迭代更新
_x+=dx[k];
_y+=dy[k];
}
}
}
}
注:其实和查不到的,改一下数据源就可以的,data改为2020.txt 的数据就可以了
3、试题 C: 跑步锻炼
试题 C: 跑步锻炼
本题总分:10 分
【问题描述】
小蓝每天都锻炼身体。正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年
10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
public class Test03跑步锻炼 {
public static int judge(int year)
{
if((year%4==0 && year%100!=0) || year%400==0)
{
return 1;
}
return 0;
}
public static void main(String[] args)
{
int[] p = {0,31,28,31,30,31,30,31,31,30,31,30,31};//平年1月到12月
int[] r = {0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年1月到12月
//起始日期
int year = 2000;
int month = 1;
int day = 1;
int xq = 6;//星期6
int ans = 0;//公里
while(true)
{
if(year==2020 && month==10 && day==1)
{
ans+=2;//10月1号也算上
System.out.print(ans);
return;
}
if(day==1 || xq==1)
{
ans+=2;
}
else
{
ans++;
}
xq = ++xq % 7;
day+=1;
int state = judge(year);//1为闰年 0为平年
if(state == 1)
{
if(day>r[month])
{
day=1;
month++;
}
}
else
{
if(day>p[month])
{
day=1;
month++;
}
}
if(month>12)
{
month=1;
year++;
}
}
}
}
4、试题 D: 平面分割
本题总分:10 分
【问题描述】
20 个圆和 20 条直线最多能把平面分成多少个部分?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
package _11第十一届02;
/*
* 试题 D: 平面分割 本题总分:10 分
【问题描述】 20 个圆和 20 条直线最多能把平面分成多少个部分?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
*/
public class Test04平面分割 {
public static void main(String[] args) {
int ans =1;
for(int i=1;i<=20;i++) {
ans*=2;
}
//System.out.println(ans);
int m=20,n=20;
int value=(int) (m*m+0.5*n*n+2*m*n-m+0.5*n+1);
System.out.println(value);
}
}
第05题 E: 七段码
试题 E: 七段码 本题总分:15 分
【问题描述】
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二 极管,分别标记为 a, b, c, d, e, f, g。 小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。 例如:b 发光,其他二极管不发光可以用来表达一种字符。 例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。 例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。 例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
思路:考的其实就是一个全排序。两层for循环就ok
```java
package _11第十一届02;
import java.util.Set;
import java.util.TreeSet;
/*
* 试题 E: 七段码 本题总分:15 分
【问题描述】
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二 极管,分别标记为 a, b, c, d, e, f, g。 小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。 例如:b 发光,其他二极管不发光可以用来表达一种字符。 例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。 例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。 例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
思路:考的其实就是一个全排序。两层for循环就ok
*/
public class Test05七段码 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String>str=new TreeSet<String>(); //去重
String a ="abcdefg";
System.out.println(a.length());
int count =0;
for(int i=0;i<=a.length();i++) {
for(int j=i+1;j<=a.length();j++) {
str.add(a.substring(i, j));
}
}
System.out.println(str.size()); //个数
}
}
第06题成绩统计
试题 F: 成绩统计 时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分
【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是 一个 0 到 100 的整数。 如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整
数。
【输入格式】
输入的第一行包含一个整数 n,表示考试人数。 接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
【输出格式】
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。
【样例输入】 7 80 92 56 74 88 100 0
试题F: 成绩统计 7
第十一届蓝桥杯大赛软件类省赛第二场 Java 大学 C 组
【样例输出】 71% 43%
【评测用例规模与约定】 对于 50% 的评测用例,1≤n≤100。 对于所有评测用例,1≤n≤10000。
package _11第十一届02;
import java.util.Scanner;
/*
* 试题 F: 成绩统计 时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分
【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是 一个 0 到 100 的整数。 如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整
数。
【输入格式】
输入的第一行包含一个整数 n,表示考试人数。 接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
【输出格式】
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。
【样例输入】 7 80 92 56 74 88 100 0
试题F: 成绩统计 7
第十一届蓝桥杯大赛软件类省赛第二场 Java 大学 C 组
【样例输出】 71% 43%
【评测用例规模与约定】 对于 50% 的评测用例,1≤n≤100。 对于所有评测用例,1≤n≤10000。
*/
public class Test06成绩统计 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int jige=0,excellent=0;
int arr[]=new int[n];
for(int i=0;i<n;i++) {
arr[i]=sc.nextInt();
}
for(int i=0;i<n;i++) {
if(arr[i]>=60) {
jige++;
}
if(arr[i]>=85) {
excellent++;
}
}
double ans=n; //转化为浮点形
double a =jige;
System.out.println(Math.round((a/ans)*100)+"%");
System.out.println(Math.round((excellent/ans)*100)+"%");
}
}
第07题单词分析
试题 G: 单词分析 时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不 住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得 最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。
【输入格式】
输入一行包含一个单词,单词只由小写英文字母组成。
【输出格式】
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
【样例输入】 lanqiao
【样例输出】 a 2
【样例输入】 longlonglongistoolong
思路:用到Hashmap 存键和值
package _11第十一届02;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/*
* 试题 G: 单词分析 时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不 住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得 最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。
【输入格式】
输入一行包含一个单词,单词只由小写英文字母组成。
【输出格式】
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
【样例输入】 lanqiao
【样例输出】 a 2
【样例输入】 longlonglongistoolong
思路:用到Hashmap 存键和值
*/
public class Test07单词分析 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
char []ch=in.nextLine().toCharArray();
Map<Character,Integer> map =solve(ch);
char an=0; //字符
int ans =0; //个数
for(Map.Entry<Character, Integer> mm:map.entrySet()) {
int flag=mm.getValue();
if(flag>ans) {
ans=flag;
an=mm.getKey();
}
}
System.out.println(an);
System.out.println(ans);
}
private static Map<Character, Integer> solve(char[] ch) {
// TODO Auto-generated method stub
Map<Character,Integer>map =new HashMap<Character, Integer>();
for (char c : ch) {
char flag=c;
Integer v=map.get(c);
if(v==null) {
map.put(c,1);
}else {
map.put(c,v+1);
}
}
return map;
}
}
第8第 数字三角形
试题 H: 时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。 对于每条路径,把路径上面的数加起来可以得到一个和,
你的任务就是找到最 大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。
此外,向左下走的次数与向右下走的次数相差不能超过 1。
【输入格式】 输入的第一行包含一个整数 N (1 < N ≤ 100),表示三角形的行数。下面的 N 行给出数字三角形。
数字三角形上的数都是 0 至 100 之间的整数。
【输出格式】
输出一个整数,表示答案。
【样例输入】 5
试题H: 数字三角形 11
第十一届蓝桥杯大赛软件类省赛第二场 Java 大学 C 组 4 5 2 6 5
【样例输出】 27
package _11第十一届02;
import java.util.Scanner;
/*
* 试题 H: 数字三角形 时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。 对于每条路径,把路径上面的数加起来可以得到一个和,
你的任务就是找到最 大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。
此外,向左下走的次数与向右下走的次数相差不能超过 1。
【输入格式】 输入的第一行包含一个整数 N (1 < N ≤ 100),表示三角形的行数。下面的 N 行给出数字三角形。
数字三角形上的数都是 0 至 100 之间的整数。
【输出格式】
输出一个整数,表示答案。
【样例输入】 5
试题H: 数字三角形 11
第十一届蓝桥杯大赛软件类省赛第二场 Java 大学 C 组 4 5 2 6 5
【样例输出】 30
*/
public class Test08数字三角形 {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int n =in.nextInt();
int res[][]= new int[n+1][n+1];
for(int i=0;i<=n;i++) {
for(int j=0;j<i;j++) {
res[i][j]=in.nextInt();
//7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
}
}
//测试三角形输入有没有错误用的
// for(int i=0;i<=5;i++) {
// for(int j=0;j<i;j++) {
// System.out.print(res[i][j] +" ");
// }
// System.out.println();
// }
int r = maxSumUsingDp(res);
System.out.println(r);
System.out.println();
int rr =summax(res, 0, 0);
System.out.println(rr);
}
public static int summax(int [][] res,int i,int j) {
int rowindex =res.length;
if(i==rowindex-1) {//如果到最后一行
return res[i][j];
}else {
return res[i][j]+Math.max(summax(res,i+1,j),summax(res, i+1, j+1));
}
}
//dp法
public static int maxSumUsingDp(int [][] triangel) {
int rowCount =triangel.length; //行数
int columnCount =triangel[rowCount-1].length; //最后一行的列数
int[][] dp =new int[rowCount][columnCount];// 生成二维表格
for(int k=0;k<columnCount;k++) {//列数
dp[rowCount-1][k]=triangel[rowCount-1][k];//初始化最后一行
}
for(int k=rowCount-2;k>=0;k--) {//倒数第二行
for(int l=0;l<=k;l++) { //第几列
dp[k][l]=triangel[k][l]+Math.max(dp[k+1][l],dp[k+1][l+1]); //比较两个数谁大
}
}
return dp[0][0];//返回头部
}
}
第九题
试题 I: 作物杂交 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分
【问题描述】 作物杂交是作物栽培中重要的一步。已知有 N 种作物 (编号 1 至 N ),第 i 种作物从播种到成熟的时间为 Ti。作物之间两两可以进行杂交,杂交时间取 两种中时间较长的一方。如作物 A 种植时间为 5 天,作物 B 种植时间为 7 天, 则 AB 杂交花费的时间为 7 天。作物杂交会产生固定的作物,新产生的作物仍 然属于 N 种作物中的一种。 初始时,拥有其中 M 种作物的种子 (数量无限,可以支持多次杂交)。同时 可以进行多个杂交过程。求问对于给定的目标种子,最少需要多少天能够得到。 如存在 4 种作物 ABCD,各自的成熟时间为 5 天、7 天、3 天、8 天。初 始拥有 AB 两种作物的种子,目标种子为 D,已知杂交情况为 A× B → C, A×C → D。则最短的杂交过程为: 第 1 天到第 7 天 (作物 B 的时间),A×B→C。 第 8 天到第 12 天 (作物 A 的时间),A×C → D。 花费 12 天得到作物 D 的种子。
【输入格式】 输入的第 1 行包含 4 个整数 N,M,K,T,N 表示作物种类总数 (编号 1 至 N),M 表示初始拥有的作物种子类型数量,K 表示可以杂交的方案数,T 表示 目标种子的编号。 第 2 行包含 N 个整数,其中第 i 个整数表示第 i 种作物的种植时间 Ti(1≤Ti ≤100)。 第 3 行包含 M 个整数,分别表示已拥有的种子类型 Kj(1 ≤ Kj ≤ M),Kj 两两不同。 第 4 至 K + 3 行,每行包含 3 个整数 A,B,C,表示第 A 类作物和第 B 类 作物杂交可以获得第 C 类作物的种子。
试题 I: 作物杂交 13
第十一届蓝桥杯大赛软件类省赛第二场 Java 大学 C 组
【输出格式】
输出一个整数,表示得到目标种子的最短杂交时间。
【样例输入】 6 2 4 6 5 3 4 6 4 9 1 2 1 2 3 1 3 4 2 3 5 4 5 6
【样例输出】 16
【样例说明】
第 1 天至第 5 天,将编号 1 与编号 2 的作物杂交,得到编号 3 的作物种 子。
第 6 天至第 10 天,将编号 1 与编号 3 的作物杂交,得到编号 4 的作物种
子。
第 6 天至第 9 天,将编号 2 与编号 3 的作物杂交,得到编号 5 的作物种
子。
第 11 天至第 16 天,将编号 4 与编号 5 的作物杂交,得到编号 6 的作物种
子。
总共花费 16 天。
【评测用例规模与约定】 对于所有评测用例,1 ≤ N ≤ 2000, 2 ≤ M ≤ N, 1 ≤ K ≤ 100000, 1 ≤ T ≤ N, 保证目标种子一定可以通过杂交得到。
第10题