• 最优交换


    题目大意

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

    如果自己说什麽都做不到而什麽都不去做的话,那就更是什麽都做不到,什麽都不会改变,什麽都不会结束.
  • 相关阅读:
    js 字符中 带 函数 再传对象参数
    window server 2012 II8 假陌生 碰到的问题
    IIS 下载文件 报错“401
    easyui使用时出现这个Uncaught TypeError: Cannot read property 'combo' of undefined
    eclipse+gnuarm+使用报错
    mini2440:通过JLink烧写BootLoader到Nor Flash
    在Linux中搭建一个FTP服务器
    SPFA模板
    Bellman_ford模板
    前向星&链式前向星
  • 原文地址:https://www.cnblogs.com/Sport-river/p/10390137.html
Copyright © 2020-2023  润新知