最优交换

题目大意

有n个正整数,每个正整数分别能进行k次(k是不同的)相邻两个数的交换操作,问最后交换最大能换到多大。

个人思路

刚看到这道题,诶!打了个贪心。每次找到最大的数,尽量把它往前挪。应该是对的吧。结果——答案错误。

什么鬼?!
3100617 3
错误样例1。这东西让我明白了这方法的错误性。如果按我的方法,则7会往前挪到第二个0的位置,答案会是310761,而最优方案却是3610017。想来想去,终于想到了方法。

正确解答

一般来说,大的数越前越好。但不要误会,不一定最大的往前挪就一定是最优的。我们可以枚举从第一个位置到最后一个位置,看看它在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");
	} 
}

posted @ 2018-01-31 07:59  Sport_River  阅读(178)  评论(0编辑  收藏  举报