最優交換
阿新 • • 發佈:2018-12-31
題目大意
有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");
}
}