刷题日记|蓝桥杯日期+动态规划+进制转换专题

108 阅读9分钟

哈喽,第一次在掘金上发文章,按以前的习惯是在公众号<易小琳>上发点学习笔记什么的,其实那个号是拿来记录生活的,后边把学习笔记也发在那上面了,我感觉文章内容分布好乱,学习账号也不是,生活分享账号也不是,所以我干脆来掘金上混了,就是一点日常学习笔记,刷题笔记之类的分享。(之前搞过自己的个人博客,在美化博客的时候搞得一塌糊涂,所以就暂时先不搞了)我目前还只是一个普通大二的小姑凉,所以写的文章就很简单且随便,希望我能坚持下去吧。

日期专题

真题 时间显示

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
 static long h, m, s;

 public static void main(String[] args) {
  Scanner scan = new Scanner(System.in);
  int n = 46800999;
  n /= 1000;// 把毫秒去掉

  n %= 86400;// 一天24小时 一小时60分钟 一分钟60秒
  h = n / 3600;// 一小时60分钟一分钟60秒 算出来多少小时
  n %= 3600;// 还剩多少秒
  m = n / 60;// 算出来多少分钟
  s = n % 60;// 还剩多少秒
  System.out.printf("%02d:%02d:%02d", h, m, s);
 }
}

真题 特殊年份

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
 public static void main(String[] args) {
  Scanner scan = new Scanner(System.in);
  int count = 0;// 计数
  int[] a = new int[5];
  for (int i = 0; i < 5; i++) {
   a[i] = scan.nextInt();
   int b = a[i] / 1000;// 千位数
   int c = a[i] / 100 % 10;// 百位
   int d = a[i] / 100 / 10;// 十位数
   int f = a[i] % 10;// 个位数
   if (b == d && f - c == 1) {
    count++;
   }
  }
  System.out.println(count);
 }
}

平年:2月是28号

闰年:2月是29号

判断闰年和平年:

(1)不能被100整除并且能被4整除

(2)能被400整除

if(year%100!=0&&year%4==0||year%4==0)

记一下模板吧我也不知道到时候能不能写出来摆烂了

static int d[] = {031,28,31,30,31,30,31,31,30313031};
 public static boolean check(int date) {
  int year = date/10000;
  int month = date%10000/100;
  int day = date%100;
  //保证 N 是一个合法日期的 8 位数表示
  if(month ==0|| month>12return false;
  if(day==0||month!=2&&day>d[month]) return false;
  if(month==2) {
   int leap=0;
   //闰年判断
   if(year%100!=0&&year%4==0||year%400==0) leap=1;
   if(day>28+leap) return false;//闰年 229天
  }
  return true;
 }

进制转换

自己去查API文档,索引处搜Integer就能查到所有想要找的。

        //十转16
  int a = 201314;
  System.out.println(Integer.toHexString(a));
        // 十转二
  System.out.println(Integer.toBinaryString(a));
        //十转八
        
        String a = "31262";
        System.out.println(Integer.toOctalString(a));
        //十六转十    
  System.out.println(Integer.valueOf(a, 16));
        //八转十
        System.out.println(Integer.valueOf(a, 8));
        //二转十
        System.out.println(Integer.valueOf(a, 2));

将字符串转换成字符数组

char s[]=str.toCharArray();

字符数字转换

(char)(‘A’+数字)转换成字符

(int)(‘Z’)转换成数字

(int)(‘Z’-‘A’)转换成数字

真题 山(找回文串个数)

看到题目的回文串需要满足两个要求:

(1)左右对称(回文) (2)数字先单调不减,后单调不增

public class Main {
 public static void main(String[] args) {

  int cnt = 0;
  // 判断区间 [2022, 2022222022] 中有多少个回文串
  for (int i = 2022; i <= 2022222022; i++) {
   if (check(i))
    cnt++;
  }
  System.out.println(cnt);
 }

 public static boolean check(long n) {
  // 创建字符串
  String s = String.valueOf(n);
  // 转为字符数组
  char[] a = s.toCharArray();
  // 判断是否单增不减 后一半就是单减不增
  // 判断是否左右对称
  for (int i = 0; i < a.length / 2; i++) {
   if (a[i] > a[i + 1] || a[i] != a[a.length - 1 - i]) {
    return false;
   }
  }
  return true;
 }
}

动态规划(DP)专题

参考文章www.acwing.com/blog/conten…

背包区别

0-1背包:i 件物品中,每件物品最多选 1 次

完全背包:i 件物品中,每件物品可以选无限次

多重背包:枚举第 i 件物品选几个

分组背包:枚举第 i 组物品选第几个(哪个)

你定义了什么,从该定义出发。 再是集合的划分 分为几类去处理, 一类是选/不选 一类是类中还细分各种类 属性的确定: max、min、count 前两个max、min是可以允许重合的 最后的答案从定义出发,输出即可。

DP基操: 1.找不同和相同之处/不同和固定之处 2.先把固定/相同的剔除,最后再把他加上 3.从剩下的范围中进行选择方案 4.结合定义出发,输出需要的答案!

0-1背包 看一下之前写的就行 mp.weixin.qq.com/s/M-vTc7KuQ…

再理一遍

package cc.hh;

import java.util.Scanner;

public class Main {
    static int n = 1010;// 这个应该是题目给的n的范围
    static int f[][] = new int[n][n];
    static int w[] = new int[n];// 重量
    static int v[] = new int[n];// 价值

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();// 物品数量
        int m = scanner.nextInt();// 能装的最大重量
        for (int i = 1; i < n; i++) {
            w[i] = scanner.nextInt();
            v[i] = scanner.nextInt();
        }
        for (int i = 1; i <= n; i++) {// 遍历物品
            for (int j = 1; j <= m; j++) {// 遍历能装的重量
                // 当前最大价值等于放上一件的最大价值 就是说当前的重量超过了放不下了只能放上一件更轻一点的
                f[i][j] = f[i - 1][j];
                // 当前能装的重量大于此时物品的重量 可以放进去或者拿出别的东西再放进去
                if (w[i] <= j) {
                    // 这个物品的价值加上当前能放的总重量减去当前物品重量时(重量为j - w[i])取前i-1个物品时对应重量时的最高价值
                    // 和不放这个物品的价值
                    // 相比较
                    f[i][j] = Math.max(v[i] + f[i - 1][j - w[i]], f[i][j]);
                }
            }
        }
        System.out.println(f[n][m]);
    }
}

完全背包

for (int i = 1; i <= n; i++) {// 遍历物品
   for (int j = 1; j <= m; j++) {// 遍历能装的重量
    for (int k = 1; k * w[i] <= j; k++) {
     // 当前最大价值等于放上一件的最大价值 就是说当前的重量超过了放不下了只能放上一件更轻一点的
     f[i][j] = f[i - 1][j];
     // 当前能装的重量大于此时物品的重量 可以放进去或者拿出别的东西再放进去
     
      // 这个物品的价值加上当前能放的总重量减去当前物品重量时(重量为j - w[i])取前i-1个物品时对应重量时的最高价值
      // 和不放这个物品的价值
      // 相比较
      f[i][j] = Math.max(k * v[i] + f[i - 1][j - k * w[i]], f[i][j]);
 
    }
   }
  }

多重背包

for (int i = 1; i <= n; i++) {// 遍历物品
   for (int j = 1; j <= m; j++) {// 遍历能装的重量
    for (int k = 1;k<=s[i]; k++) {
     // 当前最大价值等于放上一件的最大价值 就是说当前的重量超过了放不下了只能放上一件更轻一点的
     f[i][j] = f[i - 1][j];
     // 当前能装的重量大于此时物品的重量 可以放进去或者拿出别的东西再放进去
     if (k * w[i] <= j) {
      // 这个物品的价值加上当前能放的总重量减去当前物品重量时(重量为j - w[i])取前i-1个物品时对应重量时的最高价值
      // 和不放这个物品的价值
      // 相比较
      f[i][j] = Math.max(k * v[i] + f[i - 1][j - k * w[i]], f[i][j]);
     }
    }
   }
  }

有点绕不清楚了后面这两个,实在不行就套一下模板能写多少写多少吧其实没多大的改变,就是完全背包不限制数量,多重背包限制数量,完全背包每个物品可选择无限次,多重背包多了1<k<=s[i]的条件,K从0还是1开始看你有没有从0个物品开始遍历吧,我的理解是这样的

真题 线性三角形

这里面好像还涉及到图论的知识点,一脸懵逼。

我前段时间干嘛去了???leetcode没刷多少蓝桥杯也没有好好准备,后端学习进度赶的也是超级慢。。。

不多说了,我相信人一旦被逼疯的情况下学什么都是非常快的。

image

image

package cc.hh;

import java.util.Scanner;

public class Ma {
    static int INF = 0x3f3f3f3f;
    static int N = 510;
    static int f[][] = new int[N][N];
    static int a[][] = new int[N][N];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                a[i][j] = sc.nextInt();
            }
        }
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= i + 1; j++) {
                f[i][j] = -INF;
                //先把每个点的距离初始化为-INF
                //一般图论问题都是先将点的距离初始化为-INF
            }
        }

        //第1层已初始化
        //遍历第2层到第n层的三角形的所有点
        //直至最后一层遍历完毕
        f[1][1] = a[1][1];
        //起点为(1,1),只有一个点,f[1][1]=a[1][1]。
        //从第二行开始遍历第一列开始遍历
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                //到达当前点的路径为左上和右上两条路径走过来
                //再把当前点的数字加上即可
                if (j == 1) {
                    a[i][1] = a[i][1] + a[i - 1][1];
                } else {
                    f[i][j] = Math.max(f[i - 1][j - 1] + a[i][j], f[i - 1][j] + a[i][j]);
                }
            }
        }

        //如果是奇数行 必定是最中间那个数  如果是偶数行 则是中间那两个中较大的数
        int res = n % 2 == 1 ? f[n][n / 2] : Math.max(f[n][n / 2], f[n][n / 2 - 1]);
        System.out.println(res);
    }
}

网上搜的,用就是了。一般图论问题都是先将点的距离初始化为-INF

不知道为什么运行出来的不是27而是28.。。不管了。

再加一个昨天刷的题

真题 货物摆放

import java.util.ArrayList;//ArrayList包不要搞错啊这个事考自己手写的
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        ///定义一个数组存放num的因子
        //先找出num的因子 每一个位置不一样的
        long num =2021041820210418l;//这里右边加l是因为数字太大了要把int转为long型的
        ArrayList<Long> arr = new ArrayList<>();
        //开根函数Math.sqrt() 
        for(long i=1; i<=Math.sqrt(num); i++){
            if(num%i == 0){//能被整除则是因子
              arr.add(i);//放入到数组中
              //i能被整除的情况下 就能把另一个因子求出来了
              long n = num/i;
              if(n!=i){//就是两个因子不同时 就是避免两个都是开方数如num为4的时候 两个都是2 2
                  //比如num=4 i为1 n为4
                  //就把n放到数组中
                  arr.add(n); 
              }
            }
        }
        //最终因子都放入了arr数组中 
        int count = 0;//记录方案数
        //增强for
        //增强for 底层是迭代器 可以理解成简化版本的迭代器iterator遍历
        //for(元素类型 元素名 : 集合或数组){ 元素访问 }
        //普通for的我总是没搞出来不知道哪里出问题了
        for(long i : arr){
          for(long j : arr){
            for(long k : arr){
              if(i*j*k == num)
                count++;
            }
          }
        }
        System.out.println(count);
    }
}

先到这了,能不能水个奖就看运气了,最近没怎么好好准备时间全拿去赶学习进度了。