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");
}
}
剩下写的题目就不放了,大多都是真题,写了一半后面报错了…