题目意思:给出一个最多为18位的数,可以通过对相邻两个数字进行交换,最多交换 k 次,问交换 k 次之后,这个数最大可以变成多少。
贪心:从高位开始,只要存在比当前位的数大,并且交换次数在k次之内的数,总是要把这些符合条件的数中的最大的数搬到前面去,满足每一次操作都想让这个数变大。
#include <iostream>
using namespace std;
int main()
{
int k,ans;
string s;
char ch[20];
while (cin>>s>>k)
{
ans=0;
for (int i=0; i<s.size(); i++)
{
ch[i]=s[i];
}
for (int i=0; i<s.size()&& k; i++)
{
ans=i;
for (int j=i+1; j<s.size() && j-i<=k; j++)
{
if(s[j]>s[ans])
{
ans=j; //找到符合条件的最大数的下标
}
}
k-=(ans-i);
for (int j=ans-1; j>=i; j--)
{
swap(s[j], s[j+1]); //移动
}
}
cout<<s<<endl;
}
return 0;
}