分析
非常好题目, 使我的大脑旋转
错误思路:
对于每个位置, 如果发现
, 交换
这个是错误的, 因为交换后当前位置还是可以继续向前交换的
正确做法
对于每个位置, 因为只能与右侧的数字进行交换, 假设位置是
, 那么交换的条件就是
也就是说需要找到一个最大的
因为每个位置的字符都是数字, 因此范围是
算法时间复杂度
AC代码
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
void solve() {
string s;
cin >> s;
int n = s.size();
for (int i = 0; i < n; ++i) {
int idx = i;
int val = s[i] - '0';
for (int j = i + 1; j <= min(9 + i, n); ++j) {
int cur = (s[j] - '0') - (j - i);
if (cur > val) {
val = cur;
idx = j;
}
}
for (int j = idx; j > i; --j) {
swap(s[j], s[j - 1]);
s[j - 1]--;
}
s[i] = val + '0';
}
cout << s << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T;
cin >> T;
while (T--) solve();
return 0;
}

京公网安备 11010502036488号