蓝桥杯最后的冲刺篇(JAVA)
Posted 王同学要变强
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯最后的冲刺篇(JAVA)相关的知识,希望对你有一定的参考价值。
目录
友友们 又见面啦 我是你们的小王同学
蓝桥杯的正式比赛时间就是明天了,今天小王同学给大家带来几道比较经典的大题 希望能
在最后的阶段 帮助友友们
如果写的对大家有帮助的话 还可以关注小王的主页:学好c语言的小王同学的博客_CSDN博客-领域博主
你们的三连是我写作最大的动力!!(doge)
小王的gitee: 比特王信哲 (bitewang) - Gitee.com
1.路径
题目要求:
解题思路:
- 先写出求最大公约数的方法 进而推导出求最小公倍数的方法
- 从1到2021,那么我只要走得尽量少,且边尽量短就好。
- 当两个结点差的绝对值小于21的时候 公式为:
dp[j]=Math.min(dp[j],dp[i]+gb(i,j));
源码附上:
import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 public class 最短路径 public static void main(String[] args) int dp[]=new int[2022]; dp[1]=0; for(int i=2;i<=2021;i++) dp[i]=Integer.MAX_VALUE; //dp //当前q[j] 表示 从 1~j的最短距离 //q[j] 可以是 当前 1~j的最短距离 或者 前一状态 到 该点的最短距离 for(int i=1;i<=2020;i++) for(int j=i+1;j<=2021&&j-i<=21;j++) dp[j]=Math.min(dp[j],dp[i]+gb(i,j)); System.out.println(dp[2021]); public static int gcd(int a,int b) //最大公约数 return b==0?a:gcd(b,a%b); public static int gb(int a,int b) //最小公倍数 return a*b/gcd(a,b);
2.夺宝奇兵
题目要求:
解题思路:
这道题是一道经典的动态规划(dp)的题
找到状态转移方程式是最为关键的
这道题 小王同学是从最小面走到最上面
源码附上:
import java.util.Scanner;
public class Main
public static void main(String[] args)
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int A[][]=new int[n][];
for(int i=0;i<n;i++)
A[i]=new int[i+1];
for(int j = 0;j<i+1;j++)
A[i][j]=sc.nextInt();
System.out.println(maxt(A,0,0));
public static int maxt(int [][]t,int i,int j)
int rowcount=t.length;//行数
int colcount=t[rowcount-1].length;//最后一行的列数
int [][]dp=new int[rowcount][colcount];
for(int k = 0;k<colcount;k++)
dp[rowcount-1][k]=t[rowcount-1][k]; //初始化最后一行
for(int k=rowcount-2;k>=0;k--)
for(int l=0;l<=k;l++)
dp[k][l]=t[k][l]+Math.max(dp[k+1][l],dp[k+1][l+1]);
return dp[0][0]; //从下找到最上面一个
3. 七星填数
题目要求:
解题思路:
在其他没有标注节点的地方标注 不重复的数字
然后回溯排出全部情况 在判断是否满足 每条边上的4个数字之和相等就行
代码附上:
import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main public static void main(String[] args) Scanner scan = new Scanner(System.in); int arr[]=1,2,3,4,5,7,8,9,10,12,13;//将剩余没有标记的节点标记数字 dfs(arr,0); public static void dfs(int []arr,int index) if(index==arr.length) int sum1=arr[0]+arr[1]+arr[2]+arr[3]; int sum2=arr[2]+arr[4]+6+11; int sum3=arr[3]+arr[4]+arr[5]+arr[6]; int sum4=6+arr[1]+arr[9]+14; int sum5=arr[0]+arr[9]+arr[8]+arr[10]; int sum6=arr[10]+arr[7]+arr[5]+11; int sum7=arr[6]+arr[7]+arr[8]+14; if(sum1==sum2&&sum1==sum3&&sum1==sum4&&sum1==sum5&&sum1==sum6&&sum1==sum7) //判断七条边之和是否相等 System.out.println(arr[0]+" "+arr[1]+" "+arr[2]+" "+arr[3]); return ; return ; for (int i=index;i<arr.length;i++) //交换元素 int temp=arr[i]; arr[i]=arr[index]; arr[index]=temp; dfs(arr,index+1); temp=arr[i]; arr[i]=arr[index]; arr[index]=temp;
4.蓝桥幼儿园
题目要求:
解题思路:
这就是一道经典的并查集 的题 模板的话 可以参考这位博主写的:并查集模板_算法小猪的博客-CSDN博客 写的很详细哦!
源码附上:
import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main static Scanner sc = new Scanner(System.in); static int n=sc.nextInt(); static int m=sc.nextInt(); static int arr[]=new int[n+1];//记录 学生1~n的编号 public static void main(String[] args) for(int i=1;i<=n;i++) arr[i]=i; int t; for(int i=0;i<m;i++) t=sc.nextInt(); if(t==1) lj(sc.nextInt(),sc.nextInt()); else System.out.println(pd(sc.nextInt())==pd(sc.nextInt())?"YES":"NO"); public static void lj(int a,int b) //连接关系 int arr1=pd(a); int arr2=pd(b); arr[arr1]=arr2; static int pd(int a) //判断是否关联 if(arr[a]==a) return a; arr[a]=pd(arr[a]); return arr[a];
以上就是小王同学给大家带来考前常考的一些题型
祝友友们在明天都可以发挥自己最好的状态
取得理想的名次!!
冲刺蓝桥杯的最后30天day1
大家好😃,我是想要慢慢变得优秀的向阳🌞同学👨💻,断更了整整一年,又开始恢复CSDN更新,从今天开始逐渐恢复更新状态,正在备战蓝桥杯的小伙伴可以支持一下哦!~不能说肯定是干货,但会让你有所收获!💓💓💓
🍭 🍭 我们总是在生活扮演各种角色,却唯独很少扮演自己 🍭 🍭
🍄🍄数列求值 - 蓝桥云课 (lanqiao.cn)🍄🍄
思路:模拟题,用一个窗口来表示三项之和,每次挪动一格,a b c也要跟随着移动,用一个额外变量记录tmp = a+b+c,窗口每次移动 a = b,b = c, c = tmp,最后挪动到答案的时候输出最后一个值c即可。为了防止爆long从第四个数开始每次得到的值都要%10000取后四位的值,取模不会影响最后答案的计算,这是取模的性质决定的。
public static void main(String[] args)
long a = 1;
long b = 1;
long c = 1;
for (int i = 4; i <= 20190324; i++)
long tmp = (a + b + c) % 10000;
a = b;
b = c;
c = tmp;
System.out.println(c);//答案最后是4659
🥦🥦质数 - 蓝桥云课 (lanqiao.cn)🥦🥦
思路①:直接暴力模拟就行,很快就能出答案。
思路②:用欧式筛法来提前打好质数数组表,最后直接输入要找第多少个,得到质数数组表里存的答案
//暴力法,根据题意来模拟就行
public static void main(String[] args)
boolean flag = true;
int count = 0;
int ans = 0;
for (int i = 2; i < Integer.MAX_VALUE; i++) //因为不知道第2019个质数,所以i结束条件尽量要大,最后跳出循环的是break
for (int j = 2; j <= i/j; j++) // i/j相当于根号i,只不过比根号i更高效,记住这个小技巧就行
if(i % j ==0)
flag = false;
break;
if(flag) count++;
if(count == 2019)
ans = i;
break;
flag = true;
System.out.println(ans);//最后答案是17569
//欧式筛法
public static void main2(String[] args)
int n = (int) 1e6;//求第2019个质数,打1e6的表够用,不放心可以打更大的
int count = 0;
int[] prime = new int[n+1];//存放第i个素数的值
boolean[] isPrime = new boolean[n+1];//判断当前这个数是否为素数,默认为false,这里true表示合数,false表示素数
for (int i = 2; i <= n; i++)
if(isPrime[i] == false) prime[count++] = i;//如果为素数那么存放到prime数组
for (int j = 0; j < count && prime[j] * i <= n; j++)
isPrime[prime[j]*i] = true;//素数的倍数一定不是素数
if(i % prime[j] == 0) break;//核心!避免多次对一个数进行true赋值,提高了效率
System.out.println(prime[2018]);//最后答案是17569,数组从0开始,所以这里填写2019
如果没有学过欧式筛法,对于核心那一行的语句不是很懂,让我们举个具体例子,便于我们深入理解。如果此时i = 12,j = 0,prime[0]是2,prime[j]*i = 2*12=24不是素数赋值为true,此时达到核心语句12%2==0跳出,如果没有跳出那么下一句就是i = 12,j = 1,prime[1]是3,prime[j]*i = 3*12=36不是素数赋值为true,但是36最小质因数是2,当i = 18的时候 j = 0的时候还是会把36变为true,这样会导致重复,我们这个算法意思就是只让最小质因数来赋值改变,其他的值都不进行重复赋值了。
🌶️🌶️饮料换购 - 蓝桥云课 (lanqiao.cn)🌶️🌶️
思路:模拟题,按照题目要求来解决即可,想好再写,千万不干着急没有头绪去写。很经典的题,方法很多,我认为这个是我最容易理解的方法。
public static void main4(String[] args)
int ans = 0;
int pg = 0;
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while (n > 0) //只要还剩一瓶就能喝,喝完剩下瓶盖哪怕还不了新瓶子照样喝,喝到一瓶不剩才行,不然100的数据如果出现148答案,就是你还剩一瓶没喝,就是while循环的条件不对
ans += n;//喝完所有的饮料
pg += n;//得到的瓶盖数
n = pg / 3;//瓶盖拿去换成新的饮料
pg %= 3;//还剩多少旧瓶盖
System.out.println(ans);
以上是关于蓝桥杯最后的冲刺篇(JAVA)的主要内容,如果未能解决你的问题,请参考以下文章