蓝桥杯

蓝桥杯

文章目录

  • 蓝桥杯
    • 1. 字符逆序
    • 2. 用筛法求之N内的素数
    • 3. 字符串的输入输出处理
    • 4. 斐波那契数列(Fibonacci)
    • 5. 闰年判断
    • 6. 马虎的计算
    • 7. 不同的字串
    • 8. 三项数列求值
    • 9. 数的分解
    • 10. 迷宫
    • 11. 特别数的和
    • 12. 外卖店优先级
    • 13. 第几天
    • 14. 方格计数
    • 15. 复数幂
    • 16. 测试次数
    • 17. 快速排序-找出第k小的元素
    • 18. 递增三元组
    • 19. 螺旋折线
    • 20. 纸牌三角形
    • 21. 承压计算
    • 22. 取数位
    • 23. 最大公共子串
    • 24.

1. 字符逆序

题目描述

将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。

输入

输入包括一行。 第一行输入的字符串。

输出

输出转换好的逆序字符串。

样例输入

I am a student

样例输出

tneduts a ma I
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);String str = input.nextLine();// 只要将字符串从后到前依次输出就行for (int i = str.length() - 1; i >= 0 ; i--) {//System.out.print(str.charAt(str.length()-i-1));System.out.print(str.charAt(i));}}
}

2. 用筛法求之N内的素数

题目描述

用筛法求之N内的素数。

输入

N

输出

0~N的素数

样例输入

100

样例输出

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);int max = Integer.parseInt(input.nextLine());for(int i = 2; i <= max; i++) {if(sushu(i))System.out.println(i + " ");}}/*** 筛选法*/public static boolean sushu(int n) {int count; //循环册数int sqrt = (int)Math.sqrt((double)n); //n的平方根,注意强制类型转换//如果完成所有的循环,那么m为素数for(count = 2 ; count <= sqrt; count++)if(n % count == 0)break;//注意最后一次循环,会执行i++,此时i=k+1,所以才有i>kif(count > sqrt)return true;elsereturn false;}
}

3. 字符串的输入输出处理

题目描述

字符串的输入输出处理。

输入

第一行是一个正整数N,最大为100。之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000。

输出

先将输入中的前N行字符串(可能含有空格)原样输出,再将余下的字符串(不含有空格)以空格或回车分割依次按行输出。每行输出之间输出一个空行。

样例输入

2
www.dotcpp.com DOTCPP
A C M
D O T CPP

样例输出

www.dotcpp.com DOTCPPA C MDOTCPP
用它:String[] c = s.split(“ “);还是用它:String[] c = s.split(“\s+”);
假如我们输入的是:1 2 3 12 11这样的数据,换言之就是数字之间有多个空格的时候,方法1将会报错,而方法2正常排序运行。因为方法1只能匹配一个空格,而方法2可以匹配多个空格。import java.io.BufferedInputStream;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input = new Scanner(new BufferedInputStream(System.in));int n = input.nextInt();sc.nextLine();for (int i = 0; i <n; i++) {String tempString=sc.nextLine();System.out.println(tempString);System.out.println();}while(sc.hasNextLine()){String tempString=sc.nextLine();String [] str = tempString.trim().split("\\s+");for(int i=0;i<str.length;i++){System.out.println(str[i]+'\n');}}}}

4. 斐波那契数列(Fibonacci)

题目描述

斐波那契数列大家都非常熟悉。它的定义是:

f(x) = 1 … (x=1,2)
f(x) = f(x-1) + f(x-2) … (x> 2)

输入

现在要求输入一个整数n,n<=39

输出

输出斐波那契数列的第n项(从0开始,第0项为0)

样例输入

4

样例输出

3
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);fibonacci_1(input.nextInt());}public static int fibonacci_1(int n) {if(n <= 0) return 0;else if(n <= 2) return 1;else {int preNum = 1;int pre2Num = 1;int outNum = 0;for (int i = 3; i < n; i++) {outNum = preNum + pre2Num;pre2Num = preNum;preNum = outNum;}return outNum;}}
}

5. 闰年判断

问题描述

给定一个年份,判断这一年是不是闰年。

当以下情况之一满足时,这一年是闰年:

1.年份是4的倍数而不是100的倍数;

2.年份是400的倍数。

3.其他的年份都不是闰年。

输入格式

输入包含一个整数y,表示当前的年份。

输出格式

输出一行,如果给定的年份是闰年,则输出yes,否则输出no。

样例输入

2013

样例输出

no

样例输入

2016

样例输出

yes

数据规模与约定

1990 <= y <= 2050。

import java.util.Scanner;public class Main {public static void main(String args[]) {Scanner input = new Scanner(System.in);int year = input.nextInt();if(year%400==0)System.out.println("yes");else if((year%4)==0&&(year%100)!=0) {System.out.println("yes");elseSystem.out.printf("no");}
}

6. 马虎的计算

题目描述

小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

有一次,老师出的题目是:36 x 495 = ?

他却给抄成了:396 x 45 = ?

但结果却很戏剧性,他的答案竟然是对的!!

因为 36 * 495 = 396 * 45 = 17820

类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54

假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)

能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?

请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。

满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。

答案

142

public class Main {public static void main (String[] args) {int a,b,c,d,e;int x=0,y=0,n=0,m=0;int count=0;for(a=1;a<10;a++) {for(b=1;b<10;b++) {for(c=1;c<10;c++) {                   for(d=1;d<10;d++) {                       for(e=1;e<10;e++) {if (a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e) {m=a*10+b;            n=c*100+d*10+e;     x=a*100+d*10+b;     y=c*10+e; if(m*n==x*y) {count++; }}}}}}}System.out.println(count);}
}

7. 不同的字串

题目描述

一个字符串的非空子串是指字符串中长度至少为1 的连续的一段字符组成
的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共7 个。
注意在计算时,只算本质不同的串的个数。
请问,字符串0100110001010001 有多少个不同的非空子串?

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路

这是求串的所有子集,并且所有相同的子串算一种。

我解该题的思路是,将所有可能的子串都加入到hashset集合中。

最后返回set集合的元素个数。因为hashset会自动排除重复元素。

答案

7

100

import java.util.Scanner;
import java.util.Set;
import java.util.HashSet;public class Main {public static void main(String[] args) {String s1 = "aaab";String s2 = "0100110001010001";System.out.println(subSum(s1));System.out.println(subSum(s2));}private static int subSum(String s) {Set<String> set = new HashSet<String>();for (int i = 0; i < s.length(); i++) {for (int j = i; j < s.length(); j++) {//将每一个子串都加入到set集合中(set元素不可重复)set.add(s.substring(i, j + 1)); //注意endIndex要+1}}return set.size();}
}

8. 三项数列求值

题目描述

给定数列1, 1, 1, 3, 5, 9, 17, …,从第4 项开始,每项都是前3 项的和。求
第20190324 项的最后4 位数字。

思路

使用迭代法。

因为数字太大,且题目要求获取的是最后4位数字(可以每次对10000取余)。

答案

4659

import java.util.Scanner;public class Main {public static void main(String[] args) {int n = 20190324;int a = 1, b = 1, c = 1;for (int i = 4; i <= n; i++) {if (i % 3 == 1)a = (a + b + c) % 10000;else if (i % 3 == 2)b = (a + b + c) % 10000;else c = (a + b + c) % 10000;}if (n % 3 == 1)System.out.println(a);else if (n % 3 == 2)System.out.println(b);elseSystem.out.println(c);}
}

9. 数的分解

题目描述

把2019 分解成3 个各不相同的正整数之和,并且要求每个正整数都不包
含数字2 和4,一共有多少种不同的分解方法?
注意交换3 个整数的顺序被视为同一种方法,例如1000+1001+18 和
1001+1000+18 被视为同一种。

解题思路

首先开辟一个2020的数组,用来标记每个数中是否包含2和4。通过这样的标记,可以在判断是可以直接返回,大大加快程序执行速度。

答案

40785

public class Main {static int n = 2019;static int[] arr = new int[n + 1];public static void main(String[] args) {// check()的初始化处理1-2019,标记为1表示数字中无“2”或“4”for (int i = 1; i < arr.length; i++) {arr[i] = 1;char[] ch = String.valueOf(i).toCharArray();for (int j = 0; j < ch.length; j++) {// 处理不满足题意的数字,标记为0if (ch[j] == '2' || ch[j] == '4') {arr[i] = 0;break;}}}int count = 0;// 2019分成3个数之和a+b+c,那么a最大不超过2019/3+1=674for (int a = 1; a < n / 3 + 1; a++) {if (check(a)) {for (int b = a + 1; b < n; b++) {if (check(b)) {for (int c = b + 1; c < n; c++) {// if (a + b + c > n) {//   break;// }if (check(c)) {if (a + b + c == n) {count++;}}}}}}}System.out.println(count);}/*** 判断数字是否包含2或4,上面已经对arr[]进行初始化判断了,这里这里直接判断返回boolean*/public static boolean check(int i) {if (arr[i] == 1)return true;elsereturn false;}
}

10. 迷宫

题目描述

下图给出了一个迷宫的平面图,其中标记为1 的为障碍,标记为0 的为可
以通行的地方。

010000
000100
001001
110000

迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。
对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,一共10 步。

其中D、U、L、R 分别表示向下、向上、向左、向右走。

对于下面这个更复杂的迷宫(30 行50 列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。

请注意在字典序中 D<L<R<U。

01010101001011001001010110010110100100001000101010
00001000100000101010010000100000001001100110100101
01111011010010001000001101001011100011000000010000
01000000001010100011010000101000001010101011001011
00011111000000101000010010100010100000101100000000
11001000110101000010101100011010011010101011110111
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010
00111000001010100001100010000001000101001100001001
11000110100001110010001001010101010101010001101000
00010000100100000101001010101110100010101010000101
11100100101001001000010000010101010100100100010100
00000010000000101011001111010001100000101010100011
10101010011100001000011000010110011110110100001000
10101010100001101010100101000010100000111011101001
10000000101100010000101100101101001011100000000100
10101001000000010100100001000100000100011110101001
00101001010101101001010100011010101101110000110101
11001010000100001100000010100101000001000111000010
00001000110000110101101000000100101001001000011101
10100101000101000000001110110010110101101010100001
00101000010000110101010000100010001001000100010101
10100001000110010001000010101001010101011111010010
00000100101000000110010100101001000001000000000010
11010000001001110111001001000011101001011011101000
00000110100010001000100000001000011101000000110011
10101000101000100010001111100010101001010000001000
10000010100101001010110000000100101010001011101000
00111100001000010000000110111000000001000000001011
10000001100111010111010001000110111010101101111000

这是一道结果填空的题,你只需要算出结果后提交即可。

本题的结果为一个字符串,包含四种字母D、U、L、R,在提交答案时只填写这个字符串,填写多余的内容将无法得分。

答案

emmm还没做出来

11. 特别数的和

题目描述

小明对数位中含有2、0、1、9 的数字很感兴趣(不包括前导0),在1 到
40 中这样的数包括1、2、9、10 至32、39 和40,共28 个,他们的和是574。
请问,在1 到n 中,所有这样的数的和是多少?

输入

输入一行包含一个整数n。

输出

输出一行,包含一个整数,表示满足条件的数的和。

样例输入

40

样例输出

574
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int sum = 0;for (int i = 1; i <= n; i++) {if(check(i) == true)sum += i;}System.out.println(sum);}/*** 判断数字中是否包含2\0\1\9*/public static boolean check(int i) {char[] ch = String.valueOf(i).toCharArray();for (int j = 0; j < ch.length; j++) {if (ch[j] == '2' || ch[j] == '0' || ch[j] == '1' || ch[j] == '9') {return true;}}return false;}
}

12. 外卖店优先级

题目描述

“饱了么”外卖系统中维护着N 家外卖店,编号1 N。每家外卖店都有一个优先级,初始时(0 时刻) 优先级都为0。

每经过1 个时间单位,如果外卖店没有订单,则优先级会减少1,最低减到0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加2。

如果某家外卖店某时刻优先级大于5,则会被系统加入优先缓存中;如果优先级小于等于3,则会被清除出优先缓存。

给定T 时刻以内的M 条订单信息,请你计算T 时刻时有多少外卖店在优先缓存中。

输入格式

第一行包含3 个整数N(外卖店数量)、M(订单数) 和T(总时长)。
以下M 行每行包含两个整数ts 和id,表示ts 时刻编号id 的外卖店收到一个订单。

输出格式

输出一个整数代表答案。

样例输入

2 6 6
1 1
5 2
3 1
6 2
2 1
6 2

样例输出

1

样例解释

6 时刻时,1 号店优先级降到3,被移除出优先缓存;2 号店优先级升到6,加入优先缓存。所以是有1 家店(2 号) 在优先缓存中。

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;public class Main {public static void main(String[] args) {int N, M, T;Scanner sc = new Scanner(System.in);N = sc.nextInt();M = sc.nextInt();T = sc.nextInt();int[][] table = new int[M][2];// idSet 存放商家idSet<Integer> idSet = new HashSet<Integer>();for (int i = 0; i < M; i++) {table[i][0] = sc.nextInt();table[i][1] = sc.nextInt();idSet.add(table[i][1]); // 记录商家id}// cache 优先缓存列表Set<Integer> cache = new HashSet<Integer>();for (Integer id : idSet) {// 存放每个商家获取订单的时刻tsArrayList<Integer> order = new ArrayList<Integer>();for (int i = 0; i < M; i++) if (table[i][1] == id)order.add(table[i][0]); // 记录订单时刻ts// 自然排序order,按序拿到订单的时间序列Collections.sort(order);// 默认初始优先级为0int priority = 0;for (int ts = 1; ts <= T; ts++) {// 判断ts时刻是否有订单if (order.contains(ts)) { // 有订单for (int t = 0; t < order.size(); t++)if (order.get(t) == ts)  priority += 2;if (priority > 5)    cache.add(id);} else { // 无订单if (priority >= 1) priority -= 1;if (priority <= 3)   cache.remove(id);}}}System.out.println(cache.size());}
}

13. 第几天

题目描述

2000年的1月1日,是那一年的第1天。
那么,2000年的5月4日,是那一年的第几天?

注意:需要提交的是一个整数,不要填写任何多余内容。

答案

125

14. 方格计数

题目描述

如图所示,在二维平面上有无数个1x1的小方格。


我们以某个小方格的一个顶点为圆心画一个半径为1000的圆。
你能计算出这个圆里有多少个完整的小方格吗?

注意:需要提交的是一个整数,不要填写任何多余内容。

答案

3137548

解法:

  1. 将其看做坐标系,计算每个顶点到圆心的坐标是否小于半径,小于则在圆内
  2. 在坐标轴上的点除外,因为坐标轴上的点无法代表任何一个方格到圆心的最远距离

public class Main {public static void main(String[] args) {int r = 1000, count = 0;// 以第一象限为例for (int i = 1; i <= r; i++)for (int j = 1; j <= r; j++)// 单元格的右顶点到坐标轴原点的距离if (i*i + j*j <= r*r)count++;System.out.println(count * 4);}/* public static void main(String[] args) {int sum=0;for (int i=1;i<=1000;i++) {int t=1000*1000-i*i;sum=sum+(int)Math.sqrt(t);}System.out.println(sum*4);} */
}

15. 复数幂

题目描述

设i为虚数单位。对于任意正整数n,(2+3i)^n 的实部和虚部都是整数。
求 (2+3i)^123456 等于多少? 即(2+3i)的123456次幂,这个数字很大,要求精确表示。

答案写成 “实部±虚部i” 的形式,实部和虚部都是整数(不能用科学计数法表示),中间任何地方都不加空格,实部为正时前面不加正号。(2+3i)^2 写成: -5+12i,(2+3i)^5 的写成: 122-597i

注意

需要提交的是一个很庞大的复数,不要填写任何多余内容。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.math.BigInteger;public class Main {/*** 求(2+3i)^123456* @throws FileNotFoundException*/public static void main(String[] args) throws FileNotFoundException {//(a+bi)*(m+ni) = (a*m - b*n) + (a*n + b*m)i //a、b的值一直没变BigInteger a = BigInteger.valueOf(2);BigInteger b = BigInteger.valueOf(3);BigInteger m = BigInteger.valueOf(2);BigInteger n = BigInteger.valueOf(3);//每次都是两组数相乘for (int i = 1; i < 123456; i++) {BigInteger M = m.multiply(a).subtract(n.multiply(b)); //新的实数部分BigInteger N = m.multiply(b).add(n.multiply(a)); //新的虚数部分m=M;//如果不设置临时变量,后面b的值会出错n=N;}PrintStream out = System.out;PrintStream ps = new PrintStream(new File("ans.txt"));//默认在项目的路径System.setOut(ps);//输出在ans.txt里System.out.println(m.toString()+n.toString()+"i");System.setOut(out);//注释了下面就不会输入到控制台里System.out.println(m.toString()+n.toString()+"i");}
}

16. 测试次数

题目描述

x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。
各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测 试,并且评定出一个耐摔指数来,之后才允许上市流通。
x星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样 的,与地球上稍有不同的是,他们的第一层不是地面,而是相当于我们的2楼。
如果手机从第7层扔下去没摔坏,但第8层摔坏了,则手机耐摔指数=7。
特别地,如果手机从第1层扔下去就坏了,则耐摔指数=0。
如果到了塔的最高层第n层扔没摔坏,则耐摔指数=n

为了减少测试次数,从每个厂家抽样3部手机参加测试。
某次测试的塔高为1000层,如果我们总是采用最佳策略,在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?
请填写这个最多测试次数。

注意

需要填写的是一个整数,不要填写任何多余内容。

答案

19

https://blog.csdn.net/weixin_46239370/article/details/105727869
https://blog.csdn.net/qq_41923622/article/details/85038621
https://blog.csdn.net/ryo_218/article/details/79810705

public class Main {static int phone = 3;static int floor = 1000;static int[][] dp = new int[5][1005];public static void main(String[] args) {resolve(phone, floor);// for (int i = 0; i <= phone; i++)// for (int j = 0; j < floor; j++)// System.out.println(dp[i][j]);System.out.println(dp[phone][floor]);}public static void resolve(int phone, int floor) {for (int i = 1; i <= phone; i++) {for (int j = 1; j <= floor; j++)//无论有几部手机, 运气最差时的测试次数就是楼层的高度  dp[i][j] = j; //i部手机在j层摔坏的最坏次数为j次if (i >= 2)for (int j = 1; j <= floor; j++)for (int k = 1; k < j; k++)//从第k层摔下//min表示最佳策略, max表示最差运气 dp[i][j] = Math.min(dp[i][j], 1+Math.max(dp[i-1][k-1],dp[i][j-k]));}}
}

17. 快速排序-找出第k小的元素

找出第k小的元素

题目描述

以下代码可以从数组a[]中找出第k小的元素。
它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的。
请仔细阅读分析源码,填写划线部分缺失的内容。

import java.util.Random;
public class Main{public static int quickSelect(int a[], int l, int r, int k) {Random rand = new Random();int p = rand.nextInt(r - l + 1) + l;int x = a[p];int tmp = a[p]; a[p] = a[r]; a[r] = tmp;int i = l, j = r;while(i < j) {while(i < j && a[i] < x) i++;if(i < j) {a[j] = a[i];j--;}while(i < j && a[j] > x) j--;if(i < j) {a[i] = a[j];i++;}}a[i] = x;p = i;if(i - l + 1 == k) return a[i];if(i - l + 1 < k) return quickSelect( _________________________________ ); //填空答案else return quickSelect(a, l, i - 1, k);    }public static void main(String args[]) {int [] a = {1, 4, 2, 8, 5, 7};System.out.println(quickSelect(a, 0, 5, 4));}
}

答案

a,i+1,r,k-i+l-1

18. 递增三元组

题目描述

给定三个整数数组
A = [A1, A2, … AN],
B = [B1, B2, … BN],
C = [C1, C2, … CN],

请你统计有多少个三元组(i, j, k) 满足:
1 <= i, j, k <= N
Ai < Bj < Ck

输入格式

第一行包含一个整数N。
第二行包含N个整数A1, A2, … AN。
第三行包含N个整数B1, B2, … BN。
第四行包含N个整数C1, C2, … CN。

对于30%的数据,1 <= N <= 100
对于60%的数据,1 <= N <= 1000
对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000

输出格式

一个整数表示答案

输入样例

3
1 1 1
2 2 2
3 3 3

输出样例

27

资源约定

峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

import java.util.Arrays;
import java.util.Scanner;/*** Main*/
public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);int N = input.nextInt();int[] A = new int[N];int[] B = new int[N];int[] C = new int[N];for (int i = 0; i < C.length; i++)A[i] = input.nextInt();for (int i = 0; i < C.length; i++)B[i] = input.nextInt();for (int i = 0; i < C.length; i++)C[i] = input.nextInt();//升序Arrays.sort(A);Arrays.sort(B);Arrays.sort(C);System.out.println(res2(N, A, B, C));}/*** 傻瓜式*/public static int res1(int N, int[] A, int[] B, int[] C) {int count = 0;for (int i = 0; i < N; i++)for (int j = 0; j < N; j++)if (A[i] < B[j])for (int k = 0; k < N; k++)if (B[j] < C[k])count++;return count;}/*** 优化第三层for,由于是升序的,所以好理解*/public static int res2(int N, int[] A, int[] B, int[] C) {int count = 0;for (int i = 0; i < N; i++)for (int j = 0; j < N; j++)if (A[i] < B[j])for (int k = 0; k < N; k++)if (B[j] < C[k]) {count += (N - k);break;}return count;}
}

19. 螺旋折线

题目描述

如图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。

例如dis(0, 1)=3, dis(-2, -1)=9
给出整点坐标(X, Y),你能计算出dis(X, Y)吗?

输入格式

X和Y
对于40%的数据,-1000 <= X, Y <= 1000
对于70%的数据,-100000 <= X, Y <= 100000
对于100%的数据, -1000000000 <= X, Y <= 1000000000

输出格式

输出dis(X, Y)

输入样例

0 1

输出样例

3

资源约定

峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

推理:https://zhuanlan.zhihu.com/p/56272277
https://blog.csdn.net/sinat_41233888/article/details/87635851
https://blog.csdn.net/sugarbliss/article/details/79799760

import java.util.Scanner;public class Main {/*** 以 右下角 对角线上的点 为 参照点,测算给定的点到参照点要走的距离* @param args*/public static void main(String[] args) {Scanner sc = new Scanner(System.in);long X = sc.nextLong(), Y = sc.nextLong();long d = 0; // 距离long n = 0; // 第几圈if (Y > 0 && Math.abs(X) <= Y) { // 点在上面的横线上n = Y; // 等差数列有多少项? Y项d = (Y - X) + (2 * Y); // X的最大值是Y,第一、四象限的距离---2Y} else if (X > 0 && Math.abs(Y) <= X) { // 点在最右边的横线上n = X;d = Y + X;} else if (Y <= 0 && X >= Y - 1 && X <= -Y) { // 点在最下边的横线上n = -Y;d = -(-Y - X);} else if (X < 0 && Y >= X + 1 && Y <= -X) { // 点在最左边的横线上n = -X - 1;d = -(Y - X - 1 - 2 * X - 1);}System.out.println(sum(1L, 2 * n, 1) * 2 - d);}/*** 等差数列求和* * @param a0 首项* @param n  项数* @param d  公差* @return*/private static long sum(long a0, long n, int d) {return (2 * a0 + (n - 1) * d) * n / 2;}}

20. 纸牌三角形

题目描述

A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。
要求每个边的和相等。
下图就是一种排法:

    A9  64    83  7  5  2

这样的排法可能会有很多。
如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?
请你计算并提交该数字。
注意:需要提交的是一个整数,不要提交任何多余内容。

答案

144
public class Main {public static void main(String[] args) {// TODO Auto-generated method stubint count = 0;for (int i = 1; i < 10; i++) {for (int j = 1; j < 10; j++) {for (int k = 1; k < 10; k++) {for (int l = 1; l < 10; l++) {for (int m = 1; m < 10; m++) {for (int n = 1; n < 10; n++) {for (int o = 1; o < 10; o++) {for (int p = 1; p < 10; p++) {for (int q = 1; q < 10; q++) {if ((i + j + k + l) == (l + m + n + o) && (i + j + k + l) == (o + q + p + i)&& i != j && i != k && i != l && i != m && i != n && i != o&& i != p && i != q && j != k && j != l && j != m && j != n&& j != o && j != p && j != q && k != l && k != m && k != n&& k != o && k != p && k != q && l != m && l != n && l != o&& l != p && l != q && m != n && m != o && m != p && m != q&& n != o && n != p && n != q && o != p && o != q && p != q) {count++;}}}}}}}}}}System.out.println(count / 6);// 旋转是三种相同的,镜像也是三种相同的。所以除以6}
}

21. 承压计算

题目描述

X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。
每块金属原料的外形、尺寸完全一致,但重量不同。
金属材料被严格地堆放成金字塔形。
其中的数字代表金属块的重量(计量单位较大)。
最下一层的X代表30台极高精度的电子秤。
假设每块原料的重量都十分精确地平均落在下方的两个金属块上,
最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。
电子秤的计量单位很小,所以显示的数字很大。
工作人员发现,其中读数最小的电子秤的示数为:2086458231
请你推算出:读数最大的电子秤的示数为多少?
注意:需要提交的是一个整数,不要填写任何多余的内容。

                             {7},{5 ,8} ,{7, 8, 8},{9, 2, 7, 2}, {8, 1,4, 9, 1},{8, 1 ,8, 8, 4,1},{7, 9, 6, 1, 4, 5, 4}, {5, 6, 5, 5, 6, 9 ,5, 6}, {5, 5, 4, 7, 9, 3, 5, 5,1},{7, 5 ,7, 9, 7, 4, 7, 3, 3,1}, {4, 6,4, 5, 5, 8 ,8, 3, 2, 4, 3}, {1 ,1 ,3 ,3 ,1 ,6 ,6 ,5, 5, 4, 4, 2}, {9 ,9 ,9 ,2 ,1 ,9 ,1 ,9 ,2 ,9 ,5 ,7 ,9}, {4 ,3 ,3 ,7, 7, 9, 3, 6, 1, 3, 8, 8, 3, 7}, {3 ,6 ,8 ,1 ,5 ,3 ,9 ,5 ,8 ,3 ,8 ,1 ,8 ,3 ,3}, {8 ,3 ,2 ,3, 3, 5, 5, 8, 5, 4, 2, 8 ,6 ,7 ,6, 9}, {8 ,1 ,8 ,1 ,8 ,4 ,6 ,2 ,2 ,1 ,7 ,9 ,4 ,2 ,3 ,3 ,4}, {2 ,8 ,4 ,2 ,2 ,9 ,9, 2, 8, 3, 4, 9, 6, 3, 9, 4, 6, 9}, {7 ,9 ,7 ,4 ,9 ,7 ,6 ,6 ,2 ,8 ,9 ,4 ,1 ,8 ,1 ,7 ,2 ,1 ,6}, {9, 2, 8, 6, 4, 2, 7, 9 ,5 ,4, 1, 2, 5, 1, 7, 3, 9, 8, 3, 3}, {5 ,2 ,1 ,6 ,7 ,9 ,3 ,2 ,8 ,9 ,5 ,5 ,6 ,6 ,6 ,2 ,1 ,8 ,7 ,9 ,9}, {6 ,7 ,1 ,8 ,8 ,7, 5, 3, 6, 5, 4, 7, 3, 4, 6, 7, 8, 1, 3, 2, 7, 4}, {2 ,2 ,6 ,3 ,5 ,3, 4 ,9 ,2 ,4 ,5 ,7 ,6 ,6 ,3 ,2 ,7 ,2 ,4 ,8 ,5 ,5 ,4}, {7 ,4 ,4 ,5 ,8, 3, 3, 8, 1, 8, 6, 3, 2, 1, 6, 2, 6, 4, 6, 3, 8, 2, 9, 6}, {1 ,2 ,4 ,1 ,3 ,3 ,5 ,3 ,4 ,9 ,6 ,3 ,8 ,6 ,5 ,9 ,1 ,5 ,3 ,2 ,6 ,8 ,8 ,5 ,3}, {2 ,2 ,7, 9, 3, 3, 2, 8, 6, 9, 8, 4, 4, 9, 5, 8, 2, 6, 3, 4, 8, 4, 9, 3, 8, 8}, {7 ,7 ,7 ,9 ,7 ,5 ,2 ,7 ,9 ,2 ,5 ,1 ,9 ,2 ,6 ,5, 3 ,9 ,3 ,5 ,7 ,3 ,5 ,4 ,2 ,8 ,9,},{7 ,7, 6, 6 ,8 ,7 ,5 ,5 ,8, 2, 4, 7, 7, 4, 7, 2, 6, 9, 2, 1, 8, 2, 9, 8, 5, 7, 3, 6} ,{5 ,9 ,4 ,5 ,5 ,7 ,5 ,5 ,6 ,3 ,5 ,3 ,9 ,5 ,8 ,9 ,5 ,4 ,1 ,2 ,6 ,1 ,4 ,3 ,5 ,3 ,2 ,4 ,1}
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

答案

72665192664
从上到下递推出最后一层电子秤上的重量。
得到结果 max=135.34946863353252  min=3.8863313030451536;
根据题目的信息,最小值显示2086458231,根据这个数字我们可以计算出最大数字显示是多少,算出来是72665192664
public class Main {static double[][] arr = new double[][] { { 7 }, { 5, 8 }, { 7, 8, 8 },{ 9, 2, 7, 2 }, { 8, 1, 4, 9, 1 },{ 8, 1, 8, 8, 4, 1 }, { 7, 9, 6, 1, 4, 5, 4 }, { 5, 6, 5, 5, 6, 9, 5, 6 },{ 5, 5, 4, 7, 9, 3, 5, 5, 1 },{ 7, 5, 7, 9, 7, 4, 7, 3, 3, 1 }, { 4, 6, 4, 5, 5, 8, 8, 3, 2, 4, 3 },{ 1, 1, 3, 3, 1, 6, 6, 5, 5, 4, 4, 2 }, { 9, 9, 9, 2, 1, 9, 1, 9, 2, 9, 5, 7, 9 },{ 4, 3, 3, 7, 7, 9, 3, 6, 1, 3, 8, 8, 3, 7 }, { 3, 6, 8, 1, 5, 3, 9, 5, 8, 3, 8, 1, 8, 3, 3 },{ 8, 3, 2, 3, 3, 5, 5, 8, 5, 4, 2, 8, 6, 7, 6, 9 }, { 8, 1, 8, 1, 8, 4, 6, 2, 2, 1, 7, 9, 4, 2, 3, 3, 4 },{ 2, 8, 4, 2, 2, 9, 9, 2, 8, 3, 4, 9, 6, 3, 9, 4, 6, 9 },{ 7, 9, 7, 4, 9, 7, 6, 6, 2, 8, 9, 4, 1, 8, 1, 7, 2, 1, 6 },{ 9, 2, 8, 6, 4, 2, 7, 9, 5, 4, 1, 2, 5, 1, 7, 3, 9, 8, 3, 3 },{ 5, 2, 1, 6, 7, 9, 3, 2, 8, 9, 5, 5, 6, 6, 6, 2, 1, 8, 7, 9, 9 },{ 6, 7, 1, 8, 8, 7, 5, 3, 6, 5, 4, 7, 3, 4, 6, 7, 8, 1, 3, 2, 7, 4 },{ 2, 2, 6, 3, 5, 3, 4, 9, 2, 4, 5, 7, 6, 6, 3, 2, 7, 2, 4, 8, 5, 5, 4 },{ 7, 4, 4, 5, 8, 3, 3, 8, 1, 8, 6, 3, 2, 1, 6, 2, 6, 4, 6, 3, 8, 2, 9, 6 },{ 1, 2, 4, 1, 3, 3, 5, 3, 4, 9, 6, 3, 8, 6, 5, 9, 1, 5, 3, 2, 6, 8, 8, 5, 3 },{ 2, 2, 7, 9, 3, 3, 2, 8, 6, 9, 8, 4, 4, 9, 5, 8, 2, 6, 3, 4, 8, 4, 9, 3, 8, 8 },{ 7, 7, 7, 9, 7, 5, 2, 7, 9, 2, 5, 1, 9, 2, 6, 5, 3, 9, 3, 5, 7, 3, 5, 4, 2, 8, 9, },{ 7, 7, 6, 6, 8, 7, 5, 5, 8, 2, 4, 7, 7, 4, 7, 2, 6, 9, 2, 1, 8, 2, 9, 8, 5, 7, 3, 6 },{ 5, 9, 4, 5, 5, 7, 5, 5, 6, 3, 5, 3, 9, 5, 8, 9, 5, 4, 1, 2, 6, 1, 4, 3, 5, 3, 2, 4, 1 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; //最后一定有30个0,否则会越界static int n = 29;public static void main(String[] args) {for (int i = 0; i < n; i++)for (int j = 0; j <= i; j++) {double avg = arr[i][j] / 2.0;arr[i + 1][j] += avg;arr[i + 1][j + 1] += avg;}double min = Double.MAX_VALUE;double max = Double.MIN_VALUE;for (int i = 0; i <= n; i++) {min = min > arr[n][i] ? arr[n][i] : min;max = max < arr[n][i] ? arr[n][i] : max;}System.out.println(max * 2086458231 / min);}
}

其他方法:https://blog.csdn.net/qq_41629684/article/details/88748845

22. 取数位

题目

求1个整数的第k位数字有很多种方法。
以下的方法就是一种。

public class Main {// 取x的长度static int len(int x) {if(x<10) return 1;return len(x/10)+1;}// 取x的第k位数字static int f(int x, int k) {if(len(x)-k==0) return x%10;return ______________________;  //填空}public static void main(String[] args) {int x = 23513;//System.out.println(len(x));System.out.println(f(x,3));}
}

对于题目中的测试数据,应该打印5。
请仔细分析源码,并补充划线部分所缺少的代码。

答案

f(x/10,k)

23. 最大公共子串

题目

最大公共子串长度问题就是:
求两个串的所有子串中能够匹配上的最大长度是多少。
比如:“abcdkkk” 和 “baabcdadabc”,
可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。
下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。

public class Main {static int f(String s1, String s2) {char[] c1 = s1.toCharArray();char[] c2 = s2.toCharArray();int[][] a = new int[c1.length+1][c2.length+1];int max = 0;for(int i=1; i<a.length; i++) {for(int j=1; j<a[i].length; j++) {if(c1[i-1]==c2[j-1]) {a[i][j] = __________________;  //填空 if(a[i][j] > max) max = a[i][j];}}}        return max;}public static void main(String[] args) {int n = f("abcdkkk", "baabcdadabc");System.out.println(n);}
}

请分析该解法的思路,并补全划线部分缺失的代码。

答案

public class Main {static int f(String s1, String s2) {char[] c1 = s1.toCharArray();char[] c2 = s2.toCharArray();int[][] a = new int[c1.length+1][c2.length+1];int max = 0;for(int i=1; i<a.length; i++) {for(int j=1; j<a[i].length; j++) {if(c1[i-1]==c2[j-1]) {a[i][j] = 1 + a[i-1][j-1];  //填空 if(a[i][j] > max) max = a[i][j];System.out.println(max);}}}// for (int i = 0; i < a.length; i++) {//  for (int j = 0; j < a[i].length; j++) {//         System.out.print(a[i][j] + " ");//   }//     System.out.println();// }return max;}public static void main(String[] args) {int n = f("abcdkkk", "baabcdadabc");System.out.println(n);}
}

24.

蓝桥杯练习合集(更新中)相关推荐

  1. 前端面试合集(更新中……)

    文章目录 一.CSS ```1.display:none.visibility:hidden和opacity: 0的区别?``` 二.JavaScript ```1.说一说JS数据类型有哪些,区别是什 ...

  2. 【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中

    Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offe ...

  3. 小程序 - 效果处理之技巧合集(更新中...)

    巧用Console.log(event) Event::事件对象,方法在执行的时候,当前环境携带的一些信息 可以打印出来.获取很多信息,根据这些信息再度寻找你需要的信息的路径.如小程序里的event. ...

  4. 薅羊毛常见问题合集——更新中

    文章目录

  5. 蓝桥杯 并查集汇总学习 及其代码

    蓝桥杯 并查集汇总学习 及其代码 这里记录一下在刷蓝桥杯的并查集的题时写的一些代码 蓝桥幼儿园 蓝桥幼儿园 :https://www.lanqiao.cn/problems/1135/learning ...

  6. matlab ifft取实部,[合集] matlab中IFFT的问题

    发信人: goodspeed (LIP & BCI & LT-WMN), 信区: Signal 标  题: [合集] matlab中IFFT的问题 发信站: BBS 水木清华站 (Sa ...

  7. 1668智能下数教程视频_你需要的教程合集更新

    最近又收集了一波网络安全资源,在文章最底部.花了将近一天时间整理,只求各位小哥哥能点个在看,分享给身边的朋友. 网络安全 --职业发展(渗透的最底部) 2019网络安全初识与职业发展https://p ...

  8. 冲击蓝桥杯-并查集,前缀和,字符串

    目录 前言 一.并查集 1.并查集的合并(带路径压缩) 2.询问是否为同一个集合 3.例题 二.前缀和 1 .前缀和是什么 2.经典题目 三- 字符串处理 1.字符串的插入 2.字符串转化为int类型 ...

  9. 2022高教杯思路合集!!全国大学生数学建模竞赛

    2022高教杯将于9.15开赛 思路贴将于晚10点前发布 粉丝可见 17日0:00转免 国一F奖3年数学建模经验团队 交流Q群:882663918 下文是2022年美赛的思路示例: 要求由于公司的规定 ...

最新文章

  1. mysql的字符串函数
  2. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(7月30日-8月5日)
  3. Entity Framework Core 3.0 和 Entity Framework 6.3 正式发布
  4. java跨库调用存储_java-调用spring数据其余存储库方法不会返回...
  5. css的position中absolute和fixed的区别
  6. Android类加载器和热修复原理
  7. Linux内核为什么会发生soft lockup?
  8. springboot内存占用大_《SpringBoot整合redis、Scheduled/quartz定时任务》
  9. CyclicBarrier源码解读
  10. mybatis源码编译教程
  11. Qt Model/View 学习(6) - Delegate教程之——渲染
  12. 什么是DNS域名解析
  13. STM32定时器控制LED灯闪烁与串口通信
  14. EXPDP命令行选项
  15. Android一些控件上显示的英文字母都被转为大写字母的原因分析及问题解决
  16. docker启动mysql报错Error starting userland proxy: listen tcp4 0.0.0.0:3306: bind: address already in use
  17. 两个经纬度偏角_怎么根据两个经纬度计算出航向
  18. Irrlicht Engine 相关信息——一些常见问题和解答
  19. Android数据备份(Android Data Backup)
  20. 【哈夫曼树】介绍与应用

热门文章

  1. LSGO类库使用方法备忘——FlexCell
  2. Java线程、Java多线程详细介绍
  3. ECMALL的登录过程机制解析
  4. php mysql表情符号_php + mysql 存入表情 【如何转义emoji表情,让它可以存入utf8的数据库】...
  5. 计算机专业学生教师节礼物,2020教师节10种实用不贵礼物推荐,最后一件老师收到最开心...
  6. SqlServer去除特殊字符
  7. C盘AppData文件占用83.7G?*(转载)
  8. JAVA毕设项目美容院业务管理系统(java+VUE+Mybatis+Maven+Mysql)
  9. 天生具有抄底做多和摸顶做空品种有哪些
  10. 昆山市招商理念何以如此恐怖?