最优交换
题目大意
有n个正整数,每个正整数分别能进行k次(k是不同的)相邻两个数的交换操作,问最后交换最大能换到多大。
个人思路
刚看到这道题,诶!打了个贪心。每次找到最大的数,尽量把它往前挪。应该是对的吧。结果——答案错误。
什么鬼?!
3100617 3
正确解答
一般来说,大的数越前越好。但不要误会,不一定最大的往前挪就一定是最优的。我们可以枚举从第一个位置到最后一个位置,看看它在k范围内最大的数是什么,改过来,再将k减去对应的数就好了。
#include<cstdio>
#include<cstring>
using namespace std;
int t,n,k,i,j,len,l,min;
char c,max,a[501];
bool bz;
int main()
{
freopen("swap.in","r",stdin);
freopen("swap.out","w",stdout);
scanf("%d\n",&t);
for (i=1;i<=t;i++)
{
scanf("%s",a+1);
scanf("%d",&k);
len=strlen(a+1);
n=0;
while (k!=0)
{
n++;
if (n>len) break;
max=' ';
if (n+k<len) min=n+k;
else min=len;
for (j=n;j<=min;j++)
{
if (a[j]>max)
{
max=a[j];
l=j;
}
}
if (max!=a[n])
{
for (j=l;j>=n+1;j--)
a[j]=a[j-1];
a[n]=max;
k-=(l-n);
}
}
printf("%s",a+1);
printf("\n");
}
}
如果自己说什麽都做不到而什麽都不去做的话,那就更是什麽都做不到,什麽都不会改变,什麽都不会结束.