Blue Bridge Cup (JAVA) の最終スプリント

目次

                1.パス

         トピックの要件:

                 問題解決のアイデア:

                ソースコードが添付されています:

 

                2. 失われたアークの襲撃者

                 トピックの要件:

                 問題解決のアイデア:

                ソースコードが添付されています: 

                3. 数字に 7 つの星を入力します

                トピックの要件:

                 問題解決のアイデア:

                 コードが添付されています:

                 4. ブルーブリッジ幼稚園

                トピックの要件:

                 問題解決のアイデア:

                ソースコードが添付されています:


 

 

友よ、また会おう、私はあなたの同級生のシャオ・ワンです。

 

 

 

 

ブルーブリッジカップの公式試合時間は明日ですが、今日はシャオ・ワンが古典的な質問をいくつか持ってきます。

最終段階で友達を助ける 

執筆がすべての人に役立つ場合は、Xiao Wang のホームページにも注意を払うことができます: c 言語をよく学んだ Xiao Wang のブログ_CSDN ブログ-フィールド ブロガー 

 

あなたの Sanlian は私が書く最大の動機です! ! (ドージェ)

Xiao Wang の gitee:  Bit Wang Xinzhe (bitewang) - Gitee.com

 

 

1.パス

パス - Lanqiao クラウド クラス (lanqiao.cn)

 トピックの要件:

 問題解決のアイデア:

  •  最初に最大公約数を求める方法を書き留めてから、最小公倍数を求める方法を導出します
  • 1年から2021年まで、私はできるだけ歩く必要がなく、側面をできるだけ短く保つ必要があります.
  • 2 つのノード間の差の絶対値が 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. インディ・ジョーンズ

Blue Bridge Cup アルゴリズムが VIP を改善 - Raiders of the Lost Ark - C Language Network

 トピックの要件:

 

 問題解決のアイデア:

この質問は、古典的な動的計画法 (dp) の質問です。

状態遷移方程式を見つけることが最も重要です 

この質問では、Xiao Wang は一番小さい側から一番上に行きました。

ソースコードが添付されています: 

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. 数字に 7 つの星を入力します

七星で数字を埋める - Lanqiao Cloud Class (lanqiao.cn)

トピックの要件:

 問題解決のアイデア:

ノードがマークされていない他の場所に一意の番号をマークします

次に、戻ってすべての状況を整理し、両側の 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. ブルーブリッジ幼稚園

 蘭橋幼稚園 - 蘭橋クラウドクラス (lanqiao.cn)

トピックの要件:

 

 問題解決のアイデア:

これは、マージ検索の古典的な質問テンプレートです. このブロガーの書き込みを参照できる場合: Merge Search Template_Algorithm 豚のブログ - 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];

    }
}

 

上記は、Xiao Wang が提供するいくつかの種類の質問です。

明日もよろしくお願いします 

念願のランキングゲット!!

 

 

おすすめ

転載: blog.csdn.net/weixin_59796310/article/details/124029180