2020蓝桥杯救命稻草--之救命15题
Posted 胡毛毛_三月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020蓝桥杯救命稻草--之救命15题相关的知识,希望对你有一定的参考价值。
2020蓝桥杯救命稻草
第一阶段:基础知识(对标省三)
Step1:基本语法(流程,控制,循环)
(半小时内独立解决“打印图形”&“数的分解”可以跳过此Step)
(拓展:用有限变量解决“斐波那契”问题。)
Step2:JavaAPI(排序,容器,字符串,大数)
(半小时内独立解决“日志统计”&“复数幂”可以跳过此Step)
(拓展:解决“人物相关性分析”部分问题。)
第二阶段:能力提升(对标省二)
Step3:数组(前缀和,差分,简单DP)
(一小时内独立解决“最大下降矩阵”&“校门外的树”可以跳过此Step)
(拓展:解决“人物相关性分析”问题。)
Step4:函数(质数筛,汉诺塔,快速幂)
(一小时内独立解决“哥德巴赫猜想”&“大数运算”可以跳过此Step)(39级台阶)
(拓展:解决“经典汉诺塔”问题。)
第三阶段:暴力美学(对标省一)
Step5:暴力破解一(全排列,二分)
(一小时内独立解决“瓜分种数”&“分巧克力”可以跳过此Step)
Step6:暴力破解二(DFS,BFS)
(一小时内独立解决“全球变暖”&“迷宫求解”可以跳过此Step)
第四阶段:考试技巧(提升大概1~2个等级)
Step7:技巧篇(无)
- 注:精选蓝桥思维算法15道,且有对标水准,几乎涵盖所有会用到的思想和算法,后边题目难度较大,恳请对代码指正优化
Step1:基本语法(流程,控制,循环)
1.“打印图形”
打印图形
时间限制: 1.0s 内存限制: 512.0MB
【问题描述】
小明刚学习完条件语句和循环语句,并且也打印了许多图形,比如菱形或者三角形。然后他突发奇想要打印一个六芒星,果然,他用了半小时就把六芒星给打印出来了,你能比他更快吗?小明为你加油哦!
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一个六芒星,表示满足题意的图形。
【样例输入】
3
4
【样例输出】
【评测用例规模与约定】
对于所有评测用例,1 ≤ n ≤ 20。
import java.util.Scanner;
public class A_PrintSixPointStar
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if(n == 1)
System.out.print('*');
else if (n > 1 && n <= 20)
int i = 4 * n - 3;
int j = 6 * n - 5;
char arr[][] = new char[i][j];
for(int a = 0; a < arr.length; a ++)
for(int b = 0; b < arr[1].length; b ++)
if (a < n - 1)
arr[a][(3 * n - 3) - a] = '*';
arr[a][(3 * n - 3) + a] = '*';
else if (a == n - 1 && b % 2 == 0)
arr[a][b] = '*';
else if (a > n - 1 && a <= 2 * n - 2)
arr[a][a - n + 1] = '*';
arr[a][3 * n - 3 - a] = '*';
arr[a][3 * n - 3 + a] = '*';
arr[a][7 * n - 7 - a] = '*';
else if(a > 2 * n - 2)
arr[a][b] = arr[4 * n - a - 4][b];
else
arr[a][b] = ' ';
for (int k = 0; k < arr.length; k++)
for (int k2 = 0; k2 < arr[1].length; k2++)
System.out.print(arr[k][k2]);
System.out.println();
2.“数的分解”
数的分解
时间限制: 1.0s 内存限制: 512.0MB
【问题描述】
把 n分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包
含数字 2和 4,一共有多少种不同的分解方法?
注意交换 3 个整数的顺序被视为同一种方法,例如 1999+3+18 和
1999+18+3 被视为同一种。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一行,包含一个整数,表示满足条件的分解方法种数。
【样例输入】
2019
【样例输出】
40785
【评测用例规模与约定】
对于所有评测用例,100 ≤ n ≤ 2500。
import java.util.Scanner;
public class B_TheNumberOfDecomposition
private static boolean judge(int s)
while( s > 0)
int t = s % 10;
if(t== 2 || t== 4)
return false;
s /= 10;
return true;
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum = 0;
if(n >= 100 && n <= 2500)
for (int i = 1; i <= n / 3 ; i++)
for (int j = 1; j < n; j++)
int k = n - i - j;
if(k > j && i < j)
if (judge(i) && judge(j) && judge(k))
sum ++;
System.out.println(sum);
3.“斐波那契”
斐波那契
时间限制: 1.0s 内存限制: 512.0MB
【问题描述】
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
<此题禁止使用数组容器等数据结构>
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】
22
【样例输出】
7704
【评测用例规模与约定】
对于所有评测用例,1 ≤ n ≤ 1,000,000。
import java.util.Scanner;
public class C_FibonacciNumber
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long a =1;
long b = 1;
long t = 1;
for (long i = 2; i < n; i++)
t = a;
a += b;
a %= 10007;
b = t;
long result = a;
System.out.println(result);
Step2:JavaAPI(排序,容器,字符串,大数)
1.“日志统计”
日志统计
时间限制: 1.0s 内存限制: 512.0MB
【问题描述】
小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有N行。其中每一行的格式是:
ts id
表示在ts时刻编号id的帖子收到一个"赞"。
现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖子曾在任意一个长度为D的时间段内收到不少于K个赞,小明就认为这个帖子曾是"热帖"。
具体来说,如果存在某个时刻T满足该帖在[T, T+D)这段时间内(注意是左闭右开区间)收到不少于K个赞,该帖就曾是"热帖"。
给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。
【输入格式】
第一行包含三个整数N、D和K。
以下N行每行一条日志,包含两个整数ts和id。
对于50%的数据,1 <= K <= N <= 1000
对于100%的数据,1 <= K <= N <= 100000 0 <= ts <= 100000 0 <= id <= 100000
【输出格式】
按从小到大的顺序输出热帖id。每个id一行。
【输入样例】
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
【输出样例】
1
3
package 精选思维15题;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
public class 日志统计step2
public static void main(String[] args)
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int D = sc.nextInt();
int K = sc.nextInt();
int arr[][] = new int [N][5];
for (int i = 0; i < N; i++)
arr[i][0] = sc.nextInt();
arr[i][1] = sc.nextInt();
for (int i = 0; i < N; i++)
int first =1;
for (int j = i+1; j < N; j++)
if (arr[j][1]==arr[i][1])
first++;
if (j==N-1)
arr[i][2]=first;
for (int i = 0; i < N; i++)
if (arr[i][2]>=K)
arr[i][3]=1;
for (int i = 0; i < N; i++)
for (int j = i+1; j < N; j++)
if (arr[i][3]==1&&arr[i][1]==arr[j][1]&&arr[j][0]-arr[i][0]<D)
arr[i][4]=1;
HashSet<Integer> ar= new HashSet<Integer>();
for (int i = 0; i < N; i++)
if (arr[i][4]==1)
ar.add(arr[i][1]);
Iterator<Integer> result = ar.iterator();
while (result.hasNext())
System.out.println(result.next());
2.“复数幂”
复数幂
【问题描述】
设i为虚数单位。对于任意正整数n,(2+3i)^n 的实部和虚部都是整数。
求 (2+3i)^123456 等于多少? 即(2+3i)的123456次幂,这个数字很大,要求精确表示。
答案写成 "实部±虚部i" 的形式,实部和虚部都是整数(不能用科学计数法表示),中间任何地方都不加空格,实部为正时前面不加正号。
(2+3i)^2 写成: -5+12i,
(2+3i)^5 的写成: 122-597i
注意:需要提交的是一个很庞大的复数,不要填写任何多余内容。
package 精选思维15题;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigInteger;
public class 复数幂step2
public static void main(String[] args) throws IOException
// TODO Auto-generated method stub
int mi = 123456;
BigInteger a = new BigInteger("2");
BigInteger b = new BigInteger("3");
BigInteger bigA;
BigInteger bigB;
for (int i = 0; i < mi-1; i++)
bigA =a.multiply(BigInteger.valueOf(2)).subtract(b.multiply(BigInteger.valueOf(3)));
bigB =a.multiply(BigInteger.valueOf(3)).add(b.multiply(BigInteger.valueOf(2)));
a = bigA;
b = bigB;
FileWriter writer = new FileWriter("第十一届蓝桥/精选思维15题/bi.text");
writer.write(b.compareTo(BigInteger.ZERO) == 1 ? a + "+" + b + "i" : a + "" + b + "i");
writer.flush();
3.“人物相关性分析”
人物相关性分析
时间限制: 1.0s 内存限制: 512.0MB
【问题描述】
小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob
有多少次同时出现。
更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本
中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本:
This is a story about Alice and Bob. Alice wants to send a private message to Bob.
假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是”Alice and Bob”
和”Bob. Alice”。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。
注意:
1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。
2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能
有字母。例如 Bobbi 並不算出现了 Bob。
【输入格式】
第一行包含一个整数 K。
第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超
过 1000000。
【输出格式】
输出一个整数,表示 Alice 和 Bob 同时出现的次数。
【样例输入】
20
This is a story about Alice and Bob. Alice wants to send a private message to Bob.
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,1 ≤ K ≤ 1000000。
import java.util.Scanner;
public class F_TheCharacterCorrelationAnalysis
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
int K = sc.nextInt();
int num = 0;
sc.nextLine();
String paragraph = sc.nextLine();
String[] stringList ;
stringList = paragraph.split(" ");
for (int i = 0; i < stringList.length - 1; i++)
int length = 0;
if(stringList[i].equals("Alice"))
for (int j = i + 1; j < stringList.length; j++)
length += 1 + stringList[j].length();
if(length <= K + 3 && stringList[j].equals("Bob"))
num ++;
break;
else if (length <= K + 4 && stringList[j].equals("Bob."))
num ++;
break;
else if(length > K)
break;
else if(stringList[i].以上是关于2020蓝桥杯救命稻草--之救命15题的主要内容,如果未能解决你的问题,请参考以下文章