Official

B - Permute to Minimize Editorial by yuto1115

解説

基本的には与えられた整数の桁を小さい順に並び替えればよいですが、先頭に \(0\) が来ないように少し手を加える必要があります。

具体的な解法としては、与えられた整数の \(0\) でない桁のうち最小のものを \(d\) とすると、\(d\) を先頭に持ってきた上で、残りの桁を小さい順に並べるのが最適です。

いくつかの実装方針が考えられますが、下記の実装例では、最も簡潔と思われる「一旦すべての桁を昇順に並べた上で、桁を先頭から順に見ていき、最初に \(0\) でない桁に出会ったタイミングでそれを先頭の桁と交換し、終了する」という実装方針をとっています。一見変なことをしているようにも思われるかもしれませんが、正当性を示すことは難しくないので、ぜひ考えてみてください。

実装例 (C++) :

#include <bits/stdc++.h>

using namespace std;

int main() {
    string x;
    cin >> x;
    sort(x.begin(), x.end());
    for (int i = 0; i < (int) x.size(); i++) {
        if (x[i] > '0') {
            swap(x[0], x[i]);
            break;
        }
    }
    cout << x << endl;
}

実装例 (Python) :

x = sorted(input())
for i in range(len(x)):
    if x[i] > '0':
        x[0], x[i] = x[i], x[0]
        break
print(''.join(x))

posted:
last update: