1. 程式人生 > >最優交換

最優交換

題目大意

有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"); } }