蓝桥杯题目(两天速成!!!包含整体备考流程)

本文分享了作者参加蓝桥杯软件赛Java研究生组的经历,包括比赛环境设置、快速准备策略、重要知识点复习、注意事项及实战技巧,适合刚接触Java基础且有一定算法训练的选手参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

上上个礼拜结束了第十五届蓝桥杯的比赛,这两天闲来无事,在这里记录一下,我参加的是软件赛java研究生组,末尾省一,回顾自己的参赛经历,总结了相关获奖经验如下:

2.比赛环境

如果你是线下统一在学校机房考,真实环境就是平时在IDE上编代码的环境,比如java用的就是2020-06版的eclipse,创建好.java文件后,就是开局一个类加main主函数,然后剩下的就是自己代码发挥了。其余语言的比赛环境基本都是不同的IDE,相关链接如下:

官方大赛编译环境(我这是第十五届,可能有变化):link
java eclipse初始配置:link

3.比赛准备

说实话,因为论文和实习相关的事,我前后就准备了两天,但我力扣刷了300多道了,所以说裸考,直接躺的基本都是大骗子,整体准备流程基本和其他比赛大差不差,主要包括:

  • 先把考试环境、语言相关的基础数据结构和算法过一遍,比如数组、集合、排序(这个很重要!!!尤其是map的排序)等等
  • 之后官网或者B站看看考试大纲、常考题型(比如日期相关的考的挺多)、考试注意事项、时间分配啥的
  • 最后直接开干真题,啥也不要管,尤其是像我一样两天速成的(因为我那时候也两个月没动力扣了,有点虚),从最新的题目倒序刷,2023、2022研究生组省赛国赛这样的,也不是刷题,有的像背题吧,五分钟有思路直接暴力或者用更好的解法,没有就看解析(蓝桥杯刷题那的解析真不是人看的…)
    相关链接如下:
官方大赛刷题网站:link
真题链接:link

4.注意事项

  • 带瓶水吧,容易饿带带面包啥的,四小时不是人呆的。
  • 注意类一定要命名为Main,主方法命名为main(这个要细看考前注意事项,考试时候主界面有,可能有变化)。
  • 能用excel(比如算天数)或者word辅助(比如用查找数数字)就用,不算作弊好像。
  • 别太纠结某个题,尤其是填空,十分钟没思路果断跳,能暴力就暴力,最后调试下看是不是测试用例对应的结果,实在不会就输出测试用例的结果也行,不知道有没有分,我最后反正有一道题直接输出。
  • 有bug不要慌,看看有无越界,字母拼写,死循环等问题,我中途还换了台机子就是因为死循环搞的IDE宕机了…
  • 最后我感觉我的总分应该是在50多分左右,不知道对不对(第15届题目比较简单较前两年而言,一道填空,五道大题,有些只用了暴力),省三我估计15分左右?一道填空一道大题。

5.两天刷的题(编码水平不够望见谅)

import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
        Main main=new Main();
        Scanner scan = new Scanner(System.in);
        int n=scan.nextInt();
        int m=scan.nextInt();
        int k=scan.nextInt();
        /* 用一个二维数组存每个比赛的分数 */
        int[][] arr=new int[n][m];
        for(int i=0;i<n;++i){
          for(int j=0;j<m;++j){
             arr[i][j]=scan.nextInt();
          }
        }
        int sum,temp;
        /* 遍历二维数组的每一个成绩,根据返回的名次得出对应分数加起来即可 */
        for(int i=0;i<n;++i){
          sum=0;
          for(int j=0;j<m;++j){
             temp=main.getRank(arr,arr[i][j],j);
             sum+=Math.max(k+1-temp,0); 
          }
          System.out.print(sum+" ");
        }
        
        scan.close();
       
    }
    /* 对于每个运动员的每个比赛成绩,计算它在当前比赛中有几个比它大的,进而计算出名次,返回名次 */
     public int getRank(int[][] arr,int curScore,int j){
           int ans=1;
           for(int i=0;i<arr.length;++i){
              if(curScore<arr[i][j]){
                 ++ans;
              }
           }
           return ans;
      }
    
}
/* 注意输出细节,不换行就行(每个输出10遍),你直接输出数就太大了 */
public class Main {
    public static void main(String[] args) {
       int[] nums={9,7,5,4,3,2,1};
       for(int i=0;i<nums.length;++i){
           for(int j=0;j<10;++j){
               System.out.print(nums[i]);
           }
       }
      
    }
}
import java.util.*;

public class Main {
    /* 简单模拟,记得如何判断闰年,年份具体范围以及最后加上2000000,1,1这天即可 */
    public static void main(String[] args) {
        Main my=new Main();
        int count=0;
        for(int y=2000;y<2000000;++y){
            for(int m=1;m<=12;++m){
                 if(my.isRun(y)){
                     if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){
                         for(int d=1;d<=31;++d){
                             if(y%m==0&&y%d==0){
                                 count++;
                             }
                         }
                     }else if(m==2){
                         for(int d=1;d<=29;++d){
                             if(y%m==0&&y%d==0){
                                 count++;
                             }
                         }
                     }else{
                         for(int d=1;d<=30;++d){
                             if(y%m==0&&y%d==0){
                                 count++;
                             }
                         }
                     }
                 }else{
                     if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){
                         for(int d=1;d<=31;++d){
                             if(y%m==0&&y%d==0){
                                 count++;
                             }
                         }
                     }else if(m==2){
                         for(int d=1;d<=28;++d){
                             if(y%m==0&&y%d==0){
                                 count++;
                             }
                         }
                     }else{
                         for(int d=1;d<=30;++d){
                             if(y%m==0&&y%d==0){
                                 count++;
                             }
                         }
                     }
                 }

            }
        }
        System.out.println(count);

    }
    public boolean isRun(int year){
        if((year%4==0&&year%100!=0)||year%400==0){
            return true;
        }else{
            return false;
        }
    }
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int k,b,N=scan.nextInt(),M=scan.nextInt();
        List<Integer> list=new ArrayList<>();
        /* 先扫描项目数,假设所有人只参加一个项目,对于每个项目它的总价钱肯定是先上涨后下降的,并且上涨的幅度随着人数增加
        是逐渐变低的 */
        for(int i=1;i<=M;++i){
          k=scan.nextInt();
          b=scan.nextInt();
          /* 扫描每个人,即每个人从1-N参加某个活动 */
          for(int j=1;j<=N;++j){
             /* 公式代表j个人参加该活动比j-1个人参加该活动的价钱差值:(kj+b)*j- *(k(j-1)+b)*(j-1)*/
             int cost=2*k*j-k+b;
             /* 总价不再上涨即退出,因为我们计算的就是最大开销 */
             if(cost>0){
                list.add(cost);
             }else{
               break;
             }
          } 
        }
        /* 计算最大的总开销 */
        long maxCost=0;
        /* 这代表总共参加活动的人数,注意肯定不能超过总人数 */
        int num=Math.min(N,list.size());
        /* 贪心思想的体现,对于每个活动开销大的放前面,然后计算总开销 */
        list.sort((o1,o2)->o2-o1);
        for(int i=0;i<num;++i){
           maxCost+=list.get(i);
        }
        System.out.println(maxCost);
        scan.close();
    }
}
import java.util.*;

/* 正常遍历,模拟它的取反步骤即可 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int m=scanner.nextInt();
        int[][] pan=new int[n][n];
        for(int i=0;i<m;++i){
            int x1=scanner.nextInt();
            int y1=scanner.nextInt();
            int x2=scanner.nextInt();
            int y2=scanner.nextInt();
            for(int row=x1-1;row<x2;++row){
                for(int col=y1-1;col<y2;++col){
                    pan[row][col]=pan[row][col]^1;
                }
            }
        }
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                System.out.print(pan[i][j]);
            }
            System.out.println();
        }
    }
}
public class Main {
    /* 博弈论:两个核心 */
    public static void main(String[] args) {
        System.out.println("LLLV");
    }
}

import java.util.*;
public class Main {
  /* 计算数位和然后排序选取即可 */ 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		int m=scanner.nextInt();
		Integer[] arr=new Integer[n];
		for(int i=1;i<=n;++i) {
			arr[i-1]=i;
		}
    /* 注意排序传入的是封装类型而不是一般类型 */
		Arrays.sort(arr,(o1,o2)->bitSum(o1)!=bitSum(o2)?bitSum(o1)-bitSum(o2):o1-o2);
		System.out.println(arr[m-1]);
        
	}
	public static int bitSum(int i) {
		String str=String.valueOf(i);
		int sum=0;
		for(int j=0;j<str.length();++j) {
			sum+=str.charAt(j)-'0';
		}
		return sum;
	}

}

public class Main {
    /* 简单 */
    public static void main(String[] args) {
        System.out.println("AAAEEEEEEHHHIIILLRRRSSTTWWWY");
    }
}

剩下写的题目就不放了,大多都是真题,写了一半后面报错了…

省流:ACM小弟版,适合java刚学完基础,算法刷了100来道的uu们,刷创新分的也推荐冲,难度一般,比较好水,比赛排名也较高
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值