[ブルーブリッジカップ]試験トレーニング2013C ++ Aグループ質問8利用不可番号

購入できません

問題の説明
シャオミンはキャンディーストアをオープンしました。彼は独創的です:フルーツキャンディーを4個と7個の2つのパックに詰めます。キャンディーは開梱して販売することはできません。

子供がお菓子を買いに来るとき、彼はこれらの2種類のパッケージを組み合わせて使用​​します。もちろん、10個のキャンディーのように、キャンディーの数を組み合わせることはできません。

コンピューターでテストできます。このパッケージの場合、利用できない最大数量は17です。17より大きい任意の数は、4および7と組み合わせることができます。

この質問の要件は、2つのパッケージの数量がわかっている場合に組み合わせることができない最大数を見つけることです。

入力形式
各パッケージの砂糖の数を示す2つの正の整数(1000以下)

出力形式
正の整数で、購入できない砂糖の最大数を示します

サンプル入力1
4 7
サンプル出力1
17
サンプル入力2
5 3
サンプル出力2
7

問題分析 

質問の意味から結論を導き出します。解決策がなければならないため、入力された2つの数値は互いに素でなければなりません。

a * x + b * y = C、xyは互いに素であり、方程式に解があり、すべての整数がx * yであるCの上限。

方法1:0〜100ポイントのギャップ

#include <iostream>
using namespace std;

int main(int argc, char** argv) {
	
	int a, b;
	cin >> a >> b;
	cout << a * b - a - b << endl;

	return 0;
}

方法2:列挙

2つの数のすべての組み合わせを列挙してコレクションに格納し、最後に逆方向に表示されない数を出力します。これは、組み合わせることができない最大の数です。

#include <iostream>
#include <set> 
using namespace std;

int main(int argc, char** argv) {
	
	int a, b;
	cin >> a >> b;
	
	set<int> ss;
	
	for(int x = 0; a*x <= a*b; x++){
		for(int y = 0; a*x + b*y <= a*b; y++){
			ss.insert(ss.end(), a*x+b*y);
		}
	}
	
	for(int i = a*b; i >= 0; i--) {
		if(ss.find(i) == ss.end()){	//i 不在set,即为答案 
			cout << i << endl;
			break;
		}
	}

	return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_44566432/article/details/115144784