nyoj1057 寻找最大数(三)

本文详细介绍了nyoj1057题目的解决方案,探讨了如何在给定条件下找到最大的数,并通过实例解析算法思路。
摘要由CSDN通过智能技术生成

寻找最大数(三)

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。

求这个新的整数的最大值是多少。

输入
多组测试数据。
每组测试数据占一行,每行有两个数N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100).
输出
每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。
样例输入
1990 1
100 0
9090000078001234 6
样例输出
9190
100
9907000008001234
//找到K范围内的最大值,与从第一个数开始的数换位置,到K为0为止。
//将这串数字定义为字符型,全程字符型处理,不再转化成数字 
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int main()
{ 
	char a[20];
	int k;//可移动次数 
 	while(scanf("%s%d",a,&k) != EOF)
 	{
	 	int i,j,len,flag,mark;
 		char temp;
 		len = strlen(a);
    	if(k==0)
    	{
    		printf("%s\n",a);
    		continue;
		}
		
 		for(i=0; i<len; i++)
	    {  
            temp = a[i];
			flag = 0;  
            for(j=i+1; j<=i+k&&j<len; j++)//贪心,从i+1到i+k寻找最大的数并记录下序号  
			{
                if(a[j] > temp) //字符有自己的ASCII值,所以可以比较。 
				{
					temp = a[j];
					mark = j;
					flag = 1;//标记 
				}  
            }  
            if(flag)//如果在上面的循环中找到了找到了比a[i]更大的数 
			{  
                for(int q=mark; q>i; q--)//一步一步相邻的交换,直到交换到i位 直接交换i位和mark位是错误的,违反题意 
				swap(a[q], a[q-1]); //因为q>i,所以循环最后的a[q-1]即是q[i] 
                k = k - mark + i; //计算剩余的可移动次数 
            }     
            if(k == 0)//移动次数用完 
            break;  
        }  
 		printf("%s\n",a);
 	}
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值