传送门Codeforces Round #249 (Div. 2) B - Pasha Maximizes
昨天晚上做的这题,做了一个来小时都没做出来。一开始想用multimap,后来折腾来折腾去还是不行,思路混乱。
快到一点的时候hcbbt同学告诉了我思路,又折腾了半小时,刚好一点半做出来比赛截止了。。
从第一位数字开始,向后找k位,取最大值。如果这个最大值大于当前位,就换掉,继续下一位的查找。不然就前进一位。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
//freopen("input.txt", "r", stdin);
long long k, i, j, number, cur, rec, cnt;
char maxNum;
char num[30];
while (~scanf("%I64d%I64d", &number, &k))
{
cur = 0;
memset(num, 0, sizeof(num));
sprintf(num, "%I64d", number);
while (k > 0 && cur != strlen(num))
{
maxNum = -1;
for (i = cur + 1, cnt = 0; cnt < k && num[i]; i++, cnt++)
{
if (num[cur] <= num[i])
{
if (num[i] > maxNum)
{
maxNum = num[i];
rec = i;
}
}
}
if (maxNum > num[cur])
{
for (j = rec; j > cur; j--) //move
swap(num[j], num[j - 1]);
k -= (rec - cur);
cur++;
}
else
cur++;
}
puts(num);
}
return 0;
}