こんにちは、私は小さな灰色の類人猿で、バグを書くことができるプログラマーです!
私のコラム「DailyBlueBridge」に注目してください。このコラムの主な機能は、近年のBlue Bridge Cup州の大会や決勝戦の本当の質問を共有し、アルゴリズムのアイデア、データ構造などを分析することです。その中に存在し、あなたが学ぶのを助けるコンテンツより多くの知識と技術に!
タイトル:購入できません
Xiao Mingはキャンディーストアをオープンしました。彼は独創的で、フルーツキャンディーをそれぞれ4と7の2つのパッケージに詰めました。キャンディーは開梱できません。子供たちがキャンディーを買いに来るとき、彼はこれら2つのパッケージを組み合わせて使用します。一部のキャンディーの数は組み合わせることができません。たとえば、10個のキャンディーを購入する場合は、コンピューターでテストできます。このタイプのパッケージでは、購入できない最大数は17個で、17個を超える数は4と7の組み合わせで使用できます。
この質問の要件は、2つのパッケージの数量がわかっている場合に組み合わせることができない最大数を見つけることです。
入る:
各パッケージの砂糖の数を示す2つの正の整数(1000以下)
リクエスト出力:
購入できない砂糖の最大量を示す正の整数、
解決できない状況を考慮する必要はありません
例えば:
ユーザー入力:
4 7
プログラムは次のように出力する必要があります。
17
もう一つの例:
ユーザー入力:
3 5
プログラムは次のように出力する必要があります。
7
リソースの合意:
ピークメモリ消費量<64MCPU消費量<1000ms
要件に厳密に従って出力し、「入力してください...」のような余分なコンテンツを印刷しないでください。
すべてのコードは同じソースファイルに配置されます。テストに合格したら、ソースコードをコピーして送信します。
注:main関数は0を返す必要があります
注:ANSI C / ANSI C ++標準のみを使用し、コンパイル環境またはオペレーティングシステムに依存する特別な関数を呼び出さないでください
注:すべての依存関数はソースファイルに明確に含まれている必要があります。プロジェクトを通じて#include <xxx>を設定して、共通のヘッダーファイルを無視することはできません。
提出するときは、希望するコンパイラタイプの選択に注意してください。
問題解決のアイデア:
数学的知識の一部は、この問題の解決プロセスで使用され、2つの未知数の線形方程式を解く計算として理解することもできます。この問題では、2種類のキャンディーの数をパッケージはaとb、キャンディーパッケージx、パッケージbキャンディーとパッケージy、合計Cキャンディーを購入します。要件を満たす組み合わせは、次の式を満たす必要があります。
a * x + b * y = C
ここに2つの解があります。共通の除数のない2つの正の整数の場合:
最初の:式を直接使用します:結合できない最大数= a * bab2番目の方法:列挙型を使用して、形成できるすべての数をリストしますが、上限があります。つまり、形成できる数はa * b未満である必要があり、形成できる数に応じて、形成できない最大の数を見つけます。特定の実装はプログラムで見ることができます。
回答のソースコード:
方法1:
package 一三年省赛真题; import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Year2013_t9 { // 求ax+by=C public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int b = scanner.nextInt(); System.out.println(answer_one(a, b)); } /** * 解法一 最大不能组合的数就是 C = a*b-a-b * */ public static int answer_one(int a,int b) { return a*b-a-b; //利用公式直接求得不能组成的最大的数字 } }
方法2:
package 一三年省赛真题; import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Year2013_t9 { // 求ax+by=C public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int b = scanner.nextInt(); System.out.println(answer_two(a, b)); } /** * 解法二 * */ public static int answer_two(int a,int b) { int max = a*b; //取得一个上限 Set<Integer> ss = new HashSet<Integer>(); //存放能组成的数字 for (int x = 0; a*x <= max ; x++) { //从第一种糖果0包开始枚举 for (int y = 0; b*y <= max; y++) { ss.add(a*x+b*y); //将能组成的数字放到哈希表中,可以避免数值重复 } } // 从max-1开始向下遍历,找出第一个不在哈希表中的数字 for (int i = max-1; i > 0; i--) { if (!ss.contains(i)) { //如果该数字不在哈希表中,则返回结果 return i; } } return 0; } }
サンプル出力: