首页 > 其他分享 >第十一届蓝桥杯题解

第十一届蓝桥杯题解

时间:2023-02-12 22:55:25浏览次数:64  
标签:第十一届 Scanner int 题解 蓝桥 edge static public String

第十一届蓝桥杯题解

A,门牌制作

签到题,利用int转换到String就可以检验每一个字符是不是2

package train;

public class test_12 {
    public static void main(String[] args){
        int ans=0;

      for(int i=1;i<=2020;i++){
          String str=String.valueOf(i);
          for(int j=0;j<str.length();j++){
              if(str.charAt(j)=='2')
                  ans++;
          }
      }
      System.out.println(ans);
    }
}

B,寻找2020

此题解法很暴力,模拟题,我是直接输入了这个矩阵,转换成字符数组,其他的好像在读

本地文件,都可以,但是输入数组,在测试网站过不了,填空题,不好操作,答案:16520

package train;

import java.util.Scanner;

public class test_13 {
    static int ans=0;
    public static void judge(int i,int j,char[][] st){
        if(i+3<st.length){
            StringBuilder s=new StringBuilder();
            s.append(st[i][j]);
            s.append(st[i+1][j]);
            s.append(st[i+2][j]);
            s.append(st[i+3][j]);
            if(s.toString().equals("2020"))
                ans++;
        }//判断行中是否有2020
        if(j+3<st.length){
            StringBuilder s=new StringBuilder();
            s.append(st[i][j]);
            s.append(st[i][j+1]);
            s.append(st[i][j+2]);
            s.append(st[i][j+3]);
            if(s.toString().equals("2020"))
                ans++;
        }//判断列是否有2020
        if(j+3<st.length&&i+3<st.length){
            StringBuilder s=new StringBuilder();
            s.append(st[i][j]);
            s.append(st[i+1][j+1]);
            s.append(st[i+2][j+2]);
            s.append(st[i+3][j+3]);
            if(s.toString().equals("2020"))
                ans++;
        }//判断斜线上是否有2020
    }
    public static void main(String[] args)
    {
        int n=300;
        char[][] map=new char[n][n];
        Scanner sc=new Scanner(System.in);
        for(int i=0;i<map.length;i++){
            map[i]=sc.next().toCharArray();
        }
        for(int i=0;i< map.length;i++)
            for(int j=0;j<map.length;j++){
                judge( i,j,map);
            }
        System.out.println(ans);
    }
}

C,蛇形填数

找到规律,就很好做,看对角线上n行n列的值就是nn+(n-1)(n-1)的值

package train;

public class test_14 {
    public static void main(String[]args)
    {
       System.out.println(20*20+19*19);
    }
}

D,七段码

利用并查集和dfs解出

并查集说白了其实是利用三个函数来创造一个树形结构,来做到查和结合集合的作用

第一个函数:begin()来初始化n'个节点

 public static void begin(){
        for(int i=1;i<=7;i++){
            pre[i]=i;
        }//每个节点都是自己的根节点
    }//初始化数组,代表7个边

第二个函数:find(int x)来查找x,y的根节点

利用路径压缩,来找到自己的上级

public static int find(int x){
        if(pre[x]==x)return x;
        return pre[x]=find(pre[x]);
    }//完成路径压缩,来找上级

第三个函数:merge(int x,int y)来合并两个集合,或者说是两个树形结构,只要合并其根节点即可,

public static boolean merge (int x,int y){
    x=find(x);y=find(y);
    if(x==y)return false;
    else  pre[x]=y;
    return true;
}

之后就是本题,具体看代码

package train;

public class test_15 {
    //表示出图的各种边的组合
    public static boolean[][] edge=new boolean[8][8];
    public static int []pre=new int [8];
    public static int ans=0;
    public static boolean[]tag=new boolean[8];
    //去查找父节点,
    public static int find(int x){
        if(pre[x]==x)return x;
        return pre[x]=find(pre[x]);
    }//完成路径压缩,来找上级
    public static void begin(){
        for(int i=1;i<=7;i++){
            pre[i]=i;
        }//每个节点都是自己的根节点
    }//初始化数组,代表7个边
    //合并两个集合,两个根节点不一样就合并
    public static void merge(int x,int y){

            pre[find(y)]=find(x);
    }
    //判断是否图连通
    public static boolean judge(){
        begin();
        for(int i=1;i<=7;i++)
            for(int j=i+1;j<=7;j++){
                if(tag[i]&&tag[j]&&edge[i][j])//判断点是不是被选择,且两点之间是否连通
                    merge(i,j);
            }
        //判断集合个数
        int collectionnum=0;
            for(int i=1;i<=7;i++)
                if(tag[i]&&pre[i]==i)
                    collectionnum++;
           return collectionnum==1;
    }
    public static void dfs(int i){
          if(i>7){
              if(judge())
                  ans++;
              return;
          }
          tag[i]=false;
          dfs(i+1);
          tag[i]=true;
          dfs(i+1);
    }
    public static void main(String []args){
        //把连通的边赋值为true
        edge[1][2] = edge[2][1] = true;
        edge[1][6] = edge[6][1] = true;
        edge[2][3] = edge[3][2] = true;
        edge[2][7] = edge[7][1] = true;
        edge[3][7] = edge[7][3] = true;
        edge[3][4] = edge[4][3] = true;
        edge[4][5] = edge[5][4] = true;
        edge[5][7] = edge[7][5] = true;
        edge[5][6] = edge[6][5] = true;
        edge[6][7] = edge[7][6] = true;
        dfs(1);
        System.out.println(ans);
    }
}

E,排序

一个长度为n的字符串,如果进行冒泡排序,假设他每次比较都进行了交换,那么它最多交换 (n-1)+(n-2)+…+1 = n*(n-1)/2 (进行n-1趟操作,第一趟操作交换n-1次,之后每趟交换的次数依次递减)。

所以先算出交换100次最少需要多长的字符串,发现不能整除,长度15的字符串要交换105次,长度14的字符串要交换91次,注意这个公式是假设么一次都交换的公式,那么我们选一个长度为15的字符串来减少5次交换次数,再看题目要求是字典序最小的字符串,所以我们从a开始数到第15个,所以我们选定abcdefghijklmno这是排序后的字符串,然后倒过来onmlkjihgfedcba(我以为到这里就结束了,经过测评,没有通过,写了一个冒泡排序,发现是105次,忘记减少5次排序了),那么此时在到过来的字符串前,只要把第6个字符放到最前面就可以减少5次交换,达到100次交换,变成jonmlkihgfedcba,

package train;
import java.util.Scanner;
public class test_16 {

public static void main(String [] args){
//    Scanner in = new Scanner(System.in);
//    int nums = in.nextInt();
//    String[] str = new String[nums];
//    String temp;
//    int cnt=0;
//		for( int i = 0; i < str.length; i++)
//    {
//        str[i] = in.nextLine();
//    }
//
//		for(int i = 0; i < nums-1; i++)	//排序次数
//    {
//        for(int j = 0; j < nums - i - 1; j++)
//        {
//            if(str[j].compareTo(str[j+1]) > 0)	//比较str1和str2
//            {
//                temp = str[j];
//                str[j] = str[j+1];
//                str[j+1] = temp;
//                cnt++;
//            }
//        }
//    }
//		for(int i = 0; i < str.length; i++)
//    {
//        System.out.println(str[i]);
//    }
//		System.out.println(cnt);
    System.out.println("jonmlkihgfedcba");
}

}

F,成绩分析

签到题

package train;

import java.util.Scanner;

public class test_17 {
    public static void main(String[]args){
        Scanner br=new Scanner(System.in);
        int n;
        n=br.nextInt();
        int [] a=new int [n];
        for(int i=0;i<n;i++){
            a[i]=br.nextInt();
        }
        int max=a[0],min=a[0],sum=0;
        double pp;
        for(int i=0;i<n;i++){
            if(max<a[i])max=a[i];
            if(min>a[i])min=a[i];
            sum+=a[i];
        }
        pp=sum/(n*1.0);
        System.out.println(max);
        System.out.println(min);
        System.out.println(String.format("%.2f",pp));
    }
}

G,单词分析

签到题

package train;

import java.util.Scanner;

public class test_18 {
    public static void main(String[] args){
        Scanner br=new Scanner(System.in);
        String s=br.nextLine();
        int []ch=new int [26];
        for(int i=0;i<s.length();i++){
            ch[s.charAt(i)-97]++;
        }
        int max=0;
        int ii=0;
        for(int i=0;i<26;i++){
            if(max<ch[i]) {
                max=ch[i];
                ii=i;
            }
        }
        char chh=(char)(ii+97);
        System.out.println(chh);
        System.out.println(max);
    }
}

H,数字三角形

经典dp,采用逆推,因为告知向左下走的次数与向右下走的次数相差不能超过 1,所以一定落在中位数上最后一位数,所以从n-1层逆推

package train;
import java.util.Scanner;

public class test_19{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] nums = new int[105][105];
        int[][] dp = new int[105][105];		
        for(int i=1; i<=n; i++){
            for(int j=1; j<=i; j++){
                nums[i][j] = sc.nextInt();
            }
        }

        if(n%2==0){
            dp[n][n/2] = nums[n][n/2];
            dp[n][n/2+1] = nums[n][n/2+1];
        } else {
            dp[n][n/2+1] = nums[n][n/2+1];
        }
        //逆向遍历dp
        for(int i=n-1; i>=1; i--){
            for(int j=1; j<=i; j++){
                //注意边界!
                if(dp[i+1][j] != 0 || dp[i+1][j+1] != 0){
                    dp[i][j] = nums[i][j] + Math.max(dp[i+1][j], dp[i+1][j+1]);//每次填充上一层的数字是逆推的最大和
                }
            }
        }
        System.out.println(dp[1][1]);
    }
}

标签:第十一届,Scanner,int,题解,蓝桥,edge,static,public,String
From: https://www.cnblogs.com/dfsdd/p/17114922.html

相关文章

  • 【题解】P3711 仓鼠的数学题
    poly令人晕眩,令人晕眩的poly.思路伯努利数。首先意识到有一个拉插题也是求自然数幂和,所以答案是关于\(n\)的\(k\)次多项式。考虑设出\(S_{n,k}=\sum\limits_......
  • [WC2019] 数树 题解
    关于https://codeforces.com/blog/entry/112709,我的评价是:你说得对,但是原神,后边忘了算了。[WC2019]数树神题。看到题后我的第一反应是:白云哭了。所以我也哭......
  • P5221 Product 题解
    求:\[\prod_{i=1}^n\prod_{j=1}^n\frac{lcm(i,j)}{gcd(i,j)}\(\bmod\104857601)\\1\leqn\leq1000000\]而且这个题的时限卡在200ms,空间卡在7.81MB。先推式子。\[......
  • CF1167G题解
    CF1167G题解传送门简化题意:数轴上有n个不相交且处于坐标为非负整数的单位正方形,给m个询问点,求出把这个点右侧的数轴逆时针旋转至与左侧相交时的角度。首先,碰撞时只......
  • CF1784C Monsters (hard version) 题解
    为了便于表述,下文中用"数"替代怪物的血量。我们换一种不同于easyversion中的计算答案的方法。我们先还是按照easyversion中的贪心操作来消除,当一个数能通过这种贪......
  • CF1786E题解
    容易为本题的弱化版CF1786C想出一个贪心:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintn,a[1000000];signedmain(){ intT; scanf("%d",&......
  • ABC268 题解
    比赛链接:https://atcoder.jp/contests/abc268/tasks题解:C对于每个盘子统计一下转那几次(3种情况)能够满足条件//bySkyRainWind#include<bits/stdc++.h>#definempr......
  • SMU 冬令营第五周蓝桥杯模拟赛
    A.[蓝桥杯2021省B2]特殊年份题目:今年是2021年,2021这个数字非常特殊,它的千位和十位相等,个位比百位大1,我们称满足这样条件的年份为特殊年份。输入5个年份,请......
  • YACS 2023年1月月赛 甲组 T2 分割数列(二) 题解
    题目链接继上个月的分割数列(一)又出了这道题。首先还是考虑$n^2DP$,设$f[i]$为分到$i$个的最小权重之和。转移枚举上一个在哪里分就行了。显然时间会超限,我们考虑......
  • YACS 2023年1月月赛 甲组 T1 树的独立集 题解
    题目链接半夜12:00我不睡觉来这里更文章来了。。。这次的甲组好简单,第一次$AK$了,这题看上去很难,要求什么不挨边,其实分析一下就是树形$DP$。首先要求不挨边,所以我......