66.ブルーブリッジカップの準備-第13回模擬大会(Javaグループ)

ブルーブリッジカップ:全国ソフトウェア情報技術専門家タレントコンペティション[1]  は、工業情報技術省のタレントエクスチェンジセンターが主催する全国IT分野のコンペティションです。北京大学、清華大学、上海交通大学など、全国で1,200以上の大学が参加し、累計参加者数は40万人を超えました。[2] 

2020年、ブルーブリッジカップコンペティションは、中国高等教育学会が発行する「国立大学科目コンペティションランキングリスト」に含まれ、教育と教育の改革と大学における革新的な才能の育成のための重要なコンペティションアイテムです。大学。[3] 

背景:第13回ブルーブリッジカップジャワグループ州大会の準備

嵐橋カップ公式サイト:https ://dasai.lanqiao.cn/pages/dasai/index.html

コンテンツ

要件に答える

トピックの説明

トピック1

トピック2

トピック3

トピック4

トピック5

トピック6

トピック7

トピック8

トピック9

トピック10

要約する

アルゴリズム演習


要件に答える

トピックの説明

注:質問に回答するには、ページの上部にある[この質問を送信]ボタンをクリックしてください。ページはコードを送信するページにジャンプし、コンパイルされた言語を選択し、記述したコードをコードボックスに貼り付けます。次に、[回答を送信]をクリックします。

回答がシステムに送信されると、システムは自動的にコードをスコアリングし、結果のリストにジャンプします。通常は数秒後に、リストから送信したコードのステータスをスコアリング結果に直接確認できます。

この質問は最初の質問です。プロンプトにC++およびJavaコードが表示されています。このコードを直接コピーして、独自のコードとして送信できます。

特に、Javaのメインクラス名はMainでなければならないことに注意してください。

トピック1

XiaolanのIPアドレスは192.168.*.21です。ここで、*は数字ですが、可能な最大数はいくつですか。

回答:255

問題の解決策: 32ビットの2進数で構成されています。IPアドレスは4バイトの2進数で、4つのセグメントに分割され、各セグメントは8ビットの2進数で、合計32ビットの2進数になります。IPアドレスはネットワークアドレスとホストアドレスの2つに分かれており、値の範囲から最大値は255(2 ^ 8-1 = 255)と判断できますが、これは常識です。

トピック2

整数gが整数AとBを同時に除算できる場合、gはAとBの最大公約数であると言われます。例:43は86と2021の公約数です。
1(両端を含む)から2021(両端を含む)までの数が、2021で1より大きい公約数を持っている数。

2021と2021の公約数は1より大きいため、計算時に1を数える必要があることに注意してください。

回答:89

問題の解決策: gcd関数はJavaの共通除数関数であり、1から2021まで1つずつ検索されます。それ自体との共通除数が1より大きい場合、つまり2以上の場合、それはそこにあることを意味します。は公約数であり、カウントが実行されます。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int count = 0;
		for (int i = 1; i <= 2021; i++) {
			if (gcd(i, 2021) > 1) {
				count++;
			}
		}
		System.out.println(count);
	}

	static int gcd(int a, int b) {
		return b > 0 ? gcd(b, a % b) : a;
	}
}

トピック3

2021は非常に特殊な数値であり、2つの非負の整数の差の2乗として表すことができます。2021= 45 * 45-2*2。
2025も特別な番号であり、2025 = 45 * 45-0*0として表すことができます。すみません、1から2021年にそのような数はいくつありますか?
9 = 3 * 3-0 * 0 = 5 * 5-4 * 4など、一部の数値には複数の表現があることに注意してください。これは、回答に対して1回だけカウントされます。

回答:1516

問題の解決策:完全一致の目的を達成するためのネストされたループの反復ループ。これには、数学の問題、sum = a * a --b * b、つまり、sumがaの場合のsum =(a + b)(ab)が含まれます。正の数b<aの場合、bは内部ループです。sumの値は(1 <= sum <= 2021)であるため、最小の正の数を取得するには、a + b=1またはab=1、明らかにabがあります。 = 1が確立されている場合、b = a-1があり、式sum =(a + a-1)(a-a + 1)を代入すると、2021 = 2a-1、a = 1011、条件があります。は1として記録され、統計をカウントするため、次のコードがあります。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int count = 0;
		int[] arr = new int[2022];
		for (int i = 1; i <= 1011; i++) {
			for (int j = 0; j < i; j++) {
				int sum = i * i - j * j;
				if (sum <= 2021) {
					arr[sum] = 1;
				}
			}
		}
		for (int j = 1; j <= 2021; j++) {
			if (arr[j] == 1)
				count++;
		}
		System.out.println(count);
	}
}

トピック4

Xiaolanは、01の文字列を使用してテキストを表現します。このテキストには、a、b、c、d、e、f、および合計6文字が含まれます。各文字の出現回数は次のとおりです。aが10回出現し、bが出現する20回、cが3回、dが4回、eが18回、fが50回発生します。

Xiaolanは、特定の01文字列を使用して各文字を表すことを意図しており、異なる文字の01文字列の長さは異なる場合があります。
テキストを表す場合、各文字に対応する01文字列が直接接続され、最終的な01文字列が形成されます。テキストを正常に復元するには、Xiaolanのコードがプレフィックスコードである必要があります。つまり、任意の文字に対応する01文字列を、別の文字に対応する01文字列のプレフィックスにすることはできません。

たとえば、有効なエンコーディングは次のとおりです。a
 :000
 b:111
 c:01
 d:001
 e:110
 f:100

cの長さは2で、他の文字のエンコードの長さは3です。このように、このテキストに必要な全長は、103 + 203 + 32 + 43 + 183 + 503=312です。
上記のエンコーディングは明らかに最適ではありません。上記のfのエンコーディングを10に変更しても条件は満たされますが、全長は262であり、50より短くなります。
符号化の全長をできるだけ短くするためには、出現回数の多い文字に対応する符号化を短くし、出現回数の少ない文字に対応する符号化を長くする必要があります。
 すみません、最適な場合、エンコード後の最小全長はどれくらいですか?

回答:219

問題の解決策:ハフマン符号化。それらを理解することをお勧めします。ここに2つのリンクを残してください

13分でハフマン符号化を学ぶ

最も完全なハフマンツリーハフマンコーディングの説明、兄弟、あなたはそれに値する

トピック5

次のマトリックスには、ABCDEFの6文字が含まれています。この文字は何回最も多く表示されますか?
 FFEEFEAAECFFBDBFBCDA
 DACDEEDCCFFAFADEFBBA
 FDCDDCDBFEFCEDDBFDBE
   EFCAAEECEECDCDECADDC
 DFAEACECFEADCBFECADF
 DFBAAADCFAFFCEADFDDA
 EAFAFFDEFECEDEEEDFBD
 BFDDFFBCFACECEDCAFAF
 EFAFCDBDCCBCCEADADAE
 BAFBACACBFCBABFDAFBE
   FCFDCFBCEDCEAFBCDBDD
 BDEFCAAAACCFFCBBAAEE
 CFEFCFDEEDCACDACECFF
 BAAAFACDBFFAEFFCCCDB
 FADDDBEBCBEEDDECFAFF
   CDEAFBCBBCBAEDFDBEBB
 BBABBFDECBCEFAABCBCF
 FBDBACCFFABEAEBEACBB
 DCBCCFADDCACFDEDECCC
 BFAFCBFECAACAFBCFBAF

回答:78

解決策:この問題にHashMapを使用する効率は非常に高くなります。最初に文字文字がないと判断された場合は、マッピング値を1に設定し、存在すると判断されたときに値に1を追加します。すべての文字をループし、最後にの値に対応する各キーの出力を取得します

import java.util.HashMap;
import java.util.Map;

public class Main {
	static String chars = 
			"FFEEFEAAECFFBDBFBCDA" + 
			"DACDEEDCCFFAFADEFBBA" + 
			"FDCDDCDBFEFCEDDBFDBE" + 
			"EFCAAEECEECDCDECADDC" + 
			"DFAEACECFEADCBFECADF" + 
			"DFBAAADCFAFFCEADFDDA" + 
			"EAFAFFDEFECEDEEEDFBD" + 
			"BFDDFFBCFACECEDCAFAF" + 
			"EFAFCDBDCCBCCEADADAE" + 
			"BAFBACACBFCBABFDAFBE" + 
			"FCFDCFBCEDCEAFBCDBDD" + 
			"BDEFCAAAACCFFCBBAAEE" + 
			"CFEFCFDEEDCACDACECFF" + 
			"BAAAFACDBFFAEFFCCCDB" + 
			"FADDDBEBCBEEDDECFAFF" + 
			"CDEAFBCBBCBAEDFDBEBB" + 
			"BBABBFDECBCEFAABCBCF" + 
			"FBDBACCFFABEAEBEACBB" + 
			"DCBCCFADDCACFDEDECCC" + 
			"BFAFCBFECAACAFBCFBAF";
	
	public static void main(String[] args) {
		Map<Character, Integer> map = new HashMap<>();
		for(int i = 0; i < chars.length(); i++) {
			char ch = chars.charAt(i);
			if(ch == 'A' || ch == 'B' || ch == 'C' || ch == 'D' || ch == 'E' || ch == 'F') {
				if(!map.containsKey(ch)) {
					map.put(ch, 1);
				} else {
					map.put(ch, map.get(ch) + 1);
				}
			}
		}
		System.out.println(map.get('A'));
		System.out.println(map.get('B'));
		System.out.println(map.get('C'));
		System.out.println(map.get('D'));
		System.out.println(map.get('E'));
		System.out.println(map.get('F'));
	}
}

トピック6

問題の説明

小欖は鉛筆を買うために店に行きたいと思っています。
鉛筆は12箱で購入する必要があり、価格はp元です。
Xiao Lanは、少なくともt本の鉛筆を購入したいと考えています。最低費用はいくらですか。

入力フォーマット

スペースで区切られた2つの整数p、tを含む行を入力します。

出力形式出力行には、回答を表す整数が含まれています。

サンプル入力

5 30

サンプル出力

15

サンプル概要

小欖は30本の鉛筆の購入を保証するために少なくとも3箱を購入する必要があります。これは合計15元の費用がかかります。

ユースケースのサイズと規則を評価する

すべての評価ケースで、1 <= p <= 100、1 <= t<=10000。

解決策: 12未満の場合は、1を直接入力します

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int p = input.nextInt();
		int t = input.nextInt();
		int num = t / 12;
		int rem = t % 12;
		if (rem > 0) {
			num = num + 1;
		}
		System.out.println(num * p);
	}
}

トピック7

問題の説明

三角形の3つの辺の長さa、b、およびcが与えられた場合、その三角形が直角三角形であるかどうかを尋ねます。

入力フォーマット

入力行には、隣接する整数間のスペースで区切られた、三角形の3つの辺の長さを表す3つの整数a、b、cが含まれています。

出力フォーマット

直角三角形の場合は「YES」(すべて大文字)を出力し、そうでない場合は「NO」(すべて大文字)を出力します。

サンプル入力

3 4 5

サンプル出力

はい

サンプル入力

4 5 4

サンプル出力

いいえ

ユースケースのサイズと規則を評価する

すべての評価ケースで1<=a、b、c<=1000。
 

解決策:三角形の構成条件は次のとおりです。三角形の3つの辺のうち、いずれかの辺が他の2つの辺の差よりも大きく、いずれかの辺が他の2つの辺の合計よりも小さい。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int a = input.nextInt();
		int b = input.nextInt();
		int c = input.nextInt();
		if ((a + b > c || a + c > b || b + c > a) && (a - b < c || a - c < b || b - c < a)) {
			if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {
				System.out.println("YES");
			} else {
				System.out.println("NO");
			}
		} else {
			System.out.println("NO");
		}
	}
}

トピック8

問題の説明
n人の子供がゲームをプレイしていて、それぞれが自分の秘密を少し共有したいと思っています。
各子には1からnまでの番号があり、番号は繰り返されません。
ゲームをより面白くするために、先生は各子供に1からnまでの数字のカードを渡しました。それぞれのカードは1回だけ表示されます。
それぞれの子供は自分の秘密を紙に書き、教師が発行したカードの番号に従って、対応する番号の付いた子供に秘密を渡します。先生が送った番号がたまたま自分の番号だったとしても、その秘密は自分の手に委ねられています。
子供たちが他の人の秘密を手に入れた後、彼らは秘密を書き留めます、そして教師はすべての子供たちに彼らの手で秘密を渡し続けるように指示します、そしてそれでもその秘密を対応する番号の子供たちにその番号に従って渡します先生が発行したカード。
これをn回繰り返します。
今、すべての子供はたくさんの秘密を覚えています。
先生は今、すべての秘密を話すことができる何人かの子供を見つけたいと思っています。先生は少なくとも何人の子供を見つけたいですか?
入力形式入力
の最初の行には整数nが含まれています。
2行目には、n個の整数a [1]、a [2]、…、a [n]が含まれ、隣接する整数はスペースで区切られ、それぞれ1からnまでの番号が付けられた子が受け取る番号を表します。
出力形式
出力行には、回答を表す整数が含まれています。
入力例621
3 5 6
4
出力例
3
説明例
最後に、子1と2はお互いの秘密を知っており、子3は自分の秘密しか知らず、子4、5、6はお互いの秘密を知っています。
すべての秘密を話すには、少なくとも3人の子供が必要です。
測定ケースのサイズと規則測定ケース
の30%について、2 <= n<=30。
評価ケースの60%について、2 <= n<=1000。
2 <= n<=100000すべての評価ケース。

問題の解決策:ユニオン検索アルゴリズムは、リンクリストと同様に、このリンクリストの内容は、リンクリスト内のすべての人に知られています。最終的な分析では、チェーンを検索します。2つのリンクがあります。

ユニオン検索の基本|新人チュートリアル

そして、セットをチェックして、|新人チュートリアルをすばやく見つけます

import java.util.Scanner;

public class Main {
	static int n;
	static int[] a;
	static int num = 0;

	static int find(int k) {
		if (a[k] == k)
			return k;
		return a[k] = find(a[k]);
	}

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		n = input.nextInt();
		int[] friends = new int[n + 1];
		a = new int[n + 1];
		for (int i = 1; i <= n; i++) {
			a[i] = i;
			friends[i] = input.nextInt();			
		}
		for (int i = 1; i <= n; i++) {
			if (find(i) != find(friends[i]))
				a[find(i)] = find(friends[i]);
		}
		for (int i = 1; i <= n; i++) {
			if (a[i] == i)
				num++;
		}
		System.out.println(num);
	}
}

トピック9

問題の説明
1からnへの順列は、半増加シーケンスと呼ばれます。これは、順列の奇数の位置の値が単調に増加し、偶数の位置の値も単調に増加することを意味します。
例:(1、2、4、3、5、7、6、8、9)は、奇数の位置が1、4、5、6、9、単調に増加する偶数であるため、半増加シーケンスです。値位置は2、3、7、8で、これも単調に増加しています。
すみません、順列1からnには、半増加シーケンスがいくつありますか?
入力形式
入力行には正の整数nが含まれています。
出力形式
出力行には、回答を表す整数が含まれています。回答が大きくなる可能性があります。回答を1000000007で割った余りを出力してください。
入力例
5
出力例
10
例説明
次の半増加シーケンスがあります:
 (1、2、3、4、5)
 (1、2、3、5、4)
 (1、2、4、3、5)
   (1、3、2、4、5)
 (1、3、2、5、4) (1、4、2、5、3)(  2、1、3、4、5)    (
 2、1、3 、5、4)    (2、1、4、3、5) (3、1、4、2、5    )評価ケースのサイズと規則評価ケースの50%について、2 <= n<=20。






すべての評価ケースで2<=n<=1000。

問題の解決策:並べ替えと組み合わせの問題。100個の数値を想定すると、50個の奇数がインクリメントされ、残りの50個の偶数はインクリメントされて一意である必要があります。これは、残りの数値が50個であり、インクリメントする必要があるためです。偶数と偶数はそれぞれ異なるパラメータで渡され、残りが取得されます。計算

import java.util.Scanner;

public class Main {
	public static long group(long a, long b) {
		long ans = 1;
		int rem = (int) 1e9 + 7;
		for (long i = 1, j = a; i <= b; i++, j--) {
			ans = ans * (j / i) % rem;
		}
		return ans;
	}

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		long n = input.nextLong();
		if (n % 2 == 0) {
			System.out.println(group(n, n / 2));
		} else
			System.out.println(group(n, (n + 1) / 2));
	}

}

トピック10

問題の説明

  シャオランはLQシティに住んでいて、今日はシャオチャオの家に遊びに行きます。LQ都市は、n行m列のグリッドと見なすことができます。Xiao Lanの家族は1行目と1列目に住んでおり、XiaoQiaoの家族はn行目とm列目に住んでいます。Xiaolanはグリッド内を歩くことができますが、グリッドの外に出たくありません。街の一部は風光明媚な公園であり、他の部分はにぎやかな通りです。小欖は通りではなく公園が好きです。彼はグリッド内の各正方形に、1とマークされたお気に入りの公園、または2とマークされた嫌いな通りのいずれかの属性をマークしました。XiaoLanとXiaoQiaoが住んでいる場所は1としてマークされています。リトルブルーは、一度に同じ行または列の1つの正方形から隣接する正方形にのみ移動できます。彼は、2とマークされた通りを2回続けて歩かないように、道を見つけたいと思っています。少なくともこの前提の下で、彼は何回通りを通り抜けなければならないのでしょうか。
入力フォーマット

  入力の最初の行には、スペースで区切られた2つの整数n、mが含まれています。次のn行は、それぞれm番目の数字列の長さで、都市のラベルを表します。

出力フォーマット

出力行には、回答を表す整数が含まれています。条件を満たす解がない場合は、-1を出力します。

サンプル入力

3 4 1121 1211 2211

サンプル出力

1

サンプル入力

3 4 1122 1221 2211

サンプル出力

-1

サンプル入力

5 6 112121 122221 221212 211122 111121

サンプル出力

5

ユースケースのサイズと規則を評価する

  評価ケースの50%について、2 <= n、m<=20。2 <= n、m<=300すべての評価ケース。

回答:この質問は私には向いていないようです。わかりません。偉大な神のdfs検索のアイデアから学ぶ

参考:

アルゴリズムの基本:BFSとDFSの直感的な説明

BFSおよびDFSアルゴリズム-ショートブック

import java.util.Scanner;

public class Main {
    private static final int INF = 0x3f3f3f3f;
    private static int n, m, res = INF;
    private static int[][] map = new int[305][305];
    private static boolean[][] st = new boolean[305][305];

    private final static int[][] next = {
            {-1, 0}, {0, 1}, {1, 0}, {0, -1}
    };

    private static void dfs(int x, int y, int count) {  //count记录已经走过的街道的数量
        if(x == n - 1 && y == m - 1) {
            // 到终点了
            res = Math.min(res, count);
            return;
        }

        st[x][y] = true;
        for(int i = 0; i < 4; i++) {
            int tx = x + next[i][0];
            int ty = y + next[i][1];

            if(tx < 0 || tx >= n || ty < 0 || ty >= m) continue;
            if(st[tx][ty]) continue;
            if(map[tx][ty] == 2 && map[x][y] == 2) continue;

            dfs(tx, ty, map[x][y] == 2 ? count + 1 : count);
        }
        st[x][y] = false;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();

        for(int i = 0; i < n; i++) {
            String line = sc.next();
            for(int j = 0; j < m; j++) {
                int ch = line.charAt(j);
                int cur = ch - '0';
                map[i][j] = cur;
            }
        }
        dfs(0, 0, 0);
        if(res == INF) res = -1;
        System.out.println(res);
    }
}


要約する

直感的な要約:シミュレーションゲームの最初の9つのコースには、まだ戦う力があります。これには、一般に、コンピューターの常識、Javaの組み込み関数、forの暴力的な解決策、文字、文字列、シェーピングの変換、いくつかのコレクションフレームワークが必要です。 、収集・整理組み合わせ問題など、もっと見直してまとめてみれば、地方の競争は難しくないと思います

アルゴリズム演習

59、ブルーブリッジカップの準備-Javaアルゴリズム(基本演習1 )1001.2014.3001.5501 60.ブルーブリッジカップの準備-Javaアルゴリズム(基本演習2)北京大学、清華大学、上海交通大学など、全国で1,200以上の大学が参加し、累計参加者数は40万人を超えました。[2] 2020年、ブルーブリッジカップコンペティションは、中国高等教育協会が発行する「国立大学科目コンペティションランキングリスト」に含まれ、教育と教育の改革と大学の革新的な才能。[3]背景:第13回ブルーブリッジカップジャワグループ州大会準備カタログ= 1001.2014.3001.5501


毎日の洞察:

        すべてのものが私を成長させます、止める理由はありません

                                                                                                                                            -トーマス

おすすめ

転載: blog.csdn.net/m0_54925305/article/details/122715106