問題
1〜9 の数字 A,B,C,D,E が与えられる。
この5つを好きな順番で並べて繋げて作れる 5桁の整数のうち最大を求めよ。
考え方(最短で理解)
最大にするには、左の桁ほど大きい数字を置くという考え方がシンプルです。
つまり
- 5つの数字を 降順(大きい順)にソート
- その順に並べて繋げる
これで必ず並べた数字が最大になります。
C++ 解法
コード
#include <bits/stdc++.h>
using namespace std;
int main() {
int A, B, C, D, E;
cin >> A >> B >> C >> D >> E;
vector<int> v = {A, B, C, D, E};
sort(v.begin(), v.end(), greater<int>());
int ans = 0;
for (int x : v) {
ans = ans * 10 + x;
}
cout << ans << '\n';
return 0;
}
1行ずつ解説
#include <bits/stdc++.h>AtCoderでよく使う「全部入りヘッダ」。これ1行で多くの標準機能が使える。
using namespace std;std:: を毎回書くのを省略する。
int main() {プログラムの開始地点。
int A, B, C, D, E;5つの数字を入れる変数を用意。
cin >> A >> B >> C >> D >> E;入力を受け取る。
vector<int> v = {A, B, C, D, E};5つの数字を vector にまとめる(並べ替えしやすくするため)。
sort(v.begin(), v.end(), greater<int>());v を **降順(大きい順)**にソートする。
これで左の桁に大きい数字が来るので最大になる。
int ans = 0;答えとなる数を作るための変数(最初は0)。
for (int x : v) {降順に並んだ v を左から順番に取り出す。
ans = ans * 10 + x;今の数を10倍して1桁左にずらし、次の数字 x を足す。
例:ans=98 で x=7 なら 98*10+7=987
}
ループ終了。
cout << ans << '\n';答えを出力。
return 0;
}終了!って感じです。
補足:なぜ降順が最適?
5桁の数は左の桁ほど影響が大きいです。
9xxxxはどんな8xxxxより必ず大きい- だから 一番大きい数字を一番左に置く
- 次に大きい数字を2桁目へ…
なので、並べ替えの最大は「降順ソート」一発で決まります。