蓝桥杯-基础练习-龟兔赛跑预测

问题描述 话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。 然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。 输入格式 输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数) 输出格式 输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。 第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。 样例输入 10 5 5 2 20 样例输出 D 4 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int v1,v2,t,s,l; v1 = sc.nextInt(); v2 = sc.nextInt(); t = sc.nextInt(); s = sc.nextInt(); l = sc.nextInt(); int T = l; int R = l; int R_delay = 0; int time = 0; while(true) { if(R_delay==0) { R -= v1; } T -= v2; time ++; // 开始赛跑 // 兔子不休息时 if(R_delay!=0) { R_delay--; } if(R_delay==0&&T-R>=t) { R_delay = s; } if(T==0||R==0) { if(T==R) { System.out.println("D"); System.out.println(time); break; } if(T<R)System.out.println("T"); else System.out.println("R"); System.out.println(time); return; } } } }

April 7, 2023 · 1 min · 晚晴

蓝桥杯-基础练习-特殊回文数

问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的。 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。 输入格式 输入一行,包含一个正整数n。 输出格式 按从小到大的顺序输出满足条件的整数,每个整数占一行。 样例输入 52 样例输出 899998 989989 998899 数据规模和约定 1<=n<=54。 import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub int n; Scanner my = new Scanner(System.in); n = my.nextInt(); //先遍历5位数 for(int a =10000;a<=99999;a++) { if((a/10000 == a%10)&& (a/1000%10 == a%100/10)) { if(a/10000+a/1000%10+a/100%10+a/10%10+a%10 == n) { System.out.println(a); } } } for(int a =100000;a<=999999;a++) { if((a/100000 == a%10)&& (a/10000%10 == a/10%10)&& (a/1000%10 ==a/100%10)) { if(a/100000+a/10000%10+a/1000%10+a/100%10+a/10%10+a%10 == n) { System.out.println(a); } } } } }

April 7, 2023 · 1 min · 晚晴

蓝桥杯-基础练习-十六进制转十进制

问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。 注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF 样例输出 65535 import java.util.Scanner; import java.math.*; public class Main{ public static void main(String Args[]){ Scanner sc = new Scanner(System.in); BigInteger n = new BigInteger(sc.next(),16); System.out.println(n); } } 笔记: 善于使用java API 哈,要不然会增加问题的复杂程度

April 7, 2023 · 1 min · 晚晴

蓝桥杯-基础练习-十六进制转八进制

问题描述 给定n个十六进制正整数,输出它们对应的八进制数。 输入格式 输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 输出格式 输出n行,每行为输入对应的八进制正整数。 【注意】 输入的十六进制数不会有前导0,比如012A。 输出的八进制数也不能有前导0。 样例输入 2 39 123ABC 样例输出 71 4435274 【提示】 先将十六进制数转换成某进制数,再由某进制数转换成八进制。 import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String [] HEX_arr; HEX_arr = new String[sc.nextInt()]; for(int i = 0;i<HEX_arr.length;i++){ HEX_arr[i] = sc.next(); } for (int i = 0;i<HEX_arr.length;i++){ BigInteger a = new BigInteger(HEX_arr[i],16); System.out.println(a.toString(8)); } } }

April 7, 2023 · 1 min · 晚晴

蓝桥杯-基础练习-杨辉三角形

问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。下面给出了杨辉三角形的前4行: 1 1 1 1 2 1 1 3 3 1 给出n,输出它的前n行。 输入格式 输入包含一个数n。 输出格式 输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。 样例输入 4 样例输出 1 1 1 1 2 1 1 3 3 1 数据规模与约定 1 <= n <= 34。 import java.util.Scanner; public class Main { public static void main(String[] args) { // 杨辉三角形 Scanner my = new Scanner(System.in); int n = my.nextInt(); int line[][] = new int[n][n]; for(int a = 0;a<n;a++) { for(int b=0;b<=a;b++) { if(b==0||b==a) { line[a][b]=1; } } } for(int a =1;a<n;a++) { for(int b=1;b<=a-1;b++) { line[a][b]=line[a-1][b-1]+line[a-1][b]; } } for(int a =0;a<n;a++) { for(int b=0;b<=a;b++) { System.out.print(String.valueOf(line[a][b])+" "); } System.out.println(); } } }

April 7, 2023 · 1 min · 晚晴

蓝桥杯-粘木棍

问题描述 有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。 输入格式 第一行两个整数N,M。 一行N个整数,表示木棍的长度。 输出格式 一行一个整数,表示最小的差距 样例输入 3 2 10 20 40 样例输出 10 数据规模和约定 N, M<=7 只通过了百分之90 的案例 7 个的时候超时了 俺也不知到如何优化 import java.util.Scanner; public class Main { static int min_sub; // 最小的差距 public static void main(String[] args) { // TODO Auto-generated method stub int[] mg; int[] mg_flag ; int[] D_length ; min_sub = 700000; int M , N ; // N 木棍 M 几段 Scanner sc= new Scanner(System.in); N = sc.nextInt(); M = sc.nextInt(); mg = new int[N]; mg_flag = new int[N]; D_length = new int[M]; for (int i = 0; i < mg.length; i++) { mg[i] = sc.nextInt(); } dfs(N,mg,mg_flag,D_length); System.out.println(min_sub); } static void dfs(int dd,int[] mg, int[] mg_flag,int[] D_length ) { if(dd == 0) { // 分完了 检测当前的 最大插差值 if(min_sub>=getNowChazhi(D_length)) { min_sub = getNowChazhi(D_length); return ; } } // 开始分了 for (int i = 0; i < mg.length ; i++) { // 首先要分的棍子必须是没被分过的 if(mg_flag[i]==0){ // 都给谁呢? 0 - M -1 for (int j = 0; j < D_length.length; j++) { mg_flag[i]=1; // 用过了 D_length[j] += mg[i]; dfs(dd-1,mg,mg_flag,D_length); D_length[j] -= mg[i]; mg_flag[i]=0; // 回溯 } } } } static int getNowChazhi(int[] D_length) { int max = 0; int min = 70000000; for (int i = 0; i < D_length.length; i++) { if(max<D_length[i]) max = D_length[i]; if(min>D_length[i]) min = D_length[i]; } return Math.abs(max-min); } }

April 6, 2023 · 2 min · 晚晴

蓝桥杯-数字三角形

题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。 输入描述 输入的第一行包含一个整数 (1≤N≤100),表示三角形的行数。 下面的N行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。 输出描述 输出一个整数,表示答案。 输入输出样例 输入 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 输出 27 运行限制 最大运行时间:1s 最大运行内存: 256M 俺也不知道为什么有一个用例过不了 目前通过率 90% import java.util.Scanner; //1:无需package //2: 类名必须Main, 不可修改 public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此输入您的代码... int n = scan.nextInt(); int[][] arr = new int[n+1][n+1]; for(int i = 1 ; i<=n ; i++){ for(int j = 1 ; j<=i ; j++){ arr[i][j] = scan.nextInt(); } } for(int i = 1 ; i<=n ; i++){ for(int j = 1 ; j<=i ; j++){ arr[i][j] = Math.max(arr[i-1][j-1],arr[i-1][j])+ arr[i][j]; } } if(n/2==0){ System.out.println(Math.max(arr[n][n/2],arr[n][n/2+1])); }else{ System.out.println(arr[n][n/2+1]); } scan.close(); } }

April 4, 2023 · 1 min · 晚晴

蓝桥杯-回文日期

问题描述 2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按 yyyymmdd 的格式写成一个8位数是 ,恰好是一个回文数。我们称这样的日期是回文日期。 有人表示 20200202 是“千年一遇”的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期:即2021年12月2日。 也有人表示 20200202并不仅仅是一个回文日期,还是一个 ABABBABA型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 型的回文日期:即2121年12月12日。算不上“千年一遇”,顶多算“千年两遇”。 给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。 输入格式 输入包含一个八位整数 ,表示日期。 输出格式 输出两行,每行1个八位数。 第一行表示下一个回文日期,第二行表示下一个 型的回文日期。 样例输入 20200202 样例输出 20211202 21211212 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String da = sc.next(); // 20200202 DateFormat bf = new SimpleDateFormat("yyyyMMdd"); Date indate = null; try { indate = bf.parse(da); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } boolean a,b; a = false; b = false; while(!(a&&b)) { indate.setTime(indate.getTime()+24*3600*1000); String aa = bf.format(indate); if(isnormal(aa)&&!a) { System.out.println(aa); a = true; } if(isSpecial(aa)&&!b) { b = true; System.out.println(aa); } } } private static boolean isnormal(String ss) { char[] t = ss.toCharArray(); for (int i = 0; i < 4; i++) { if(t[i]!=t[8-i-1]) return false; } return true; } private static boolean isSpecial(String ss) { char[] t = ss.toCharArray(); for (int i = 0; i < 4; i++) { if(t[i]!=t[8-i-1]) return false; } if(t[0]==t[2]&&t[1]==t[3]) return true; return false; } }

April 3, 2023 · 1 min · 晚晴

蓝桥杯-矩阵乘法

问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数 接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值 输出格式 输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开 样例输入 2 2 1 2 3 4 样例输出 7 10 15 22 代码示例 这道题属于基础题,易于理解,但是需要用的有关线性代数的相关知识,比如矩阵的零次幂 格式为 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m,n; m = sc.nextInt(); n = sc.nextInt(); int[][] arr = new int[m][m]; int[][] tmp = new int[m][m]; int[][] tmpt = new int[m][m]; for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { arr[i][j] = sc.nextInt(); tmpt[i][j] = arr[i][j]; tmp[i][j] = arr[i][j]; } } if(n==0) { for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { if(i==j) { System.out.print(1+ " "); }else { System.out.print(0+ " "); } } System.out.println(); } return ; } for (int ii = 1; ii < n; ii++) { for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { int a = 0; for (int k = 0; k < m; k++) { a += tmpt[j][k]*arr[k][i]; } tmp[j][i] = a; } } for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { tmpt[i][j] = tmp[i][j]; } } } for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { System.out.print(tmp[i][j]+ " "); } System.out.println(); } } }

March 28, 2023 · 2 min · 晚晴

蓝桥杯-分解质因数

问题描述 求出区间[a,b]中所有整数的质因数分解。 输入格式 输入两个整数a,b。 输出格式 每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例) 样例输入 3 10 样例输出 3=3 4=22 5=5 6=23 7=7 8=222 9=33 10=25 import java.util.Scanner; public class Main { static boolean isss(int a) { for (int i = 2; i < Math.sqrt(a)+1 ; i++) { if(a%i==0) return false; } return true; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int start ,end; start = sc.nextInt(); end = sc.nextInt(); for (int i = start ; i <= end; i++) { System.out.print(i+"="); int k = 2; int n = i; if(n >= 3 && !isss(n)) { while(n > k) { if(n%k == 0) { System.out.print(k+"*"); n = n/k; }else { k++; } } System.out.println(n); }else { System.out.println(i); } } } }

March 28, 2023 · 1 min · 晚晴