Problem E.转化最大数

Problem E.转化最大数

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 75   Accepted Submission(s) : 10
Font: Times New Roman | Verdana | Georgia
Font Size: ← →

Problem Description

对一个整数n里的相邻位置的数字最多进行k次交换操作,最后得到一个新的整数,如何操作能得到一个最大的整数?

Input

测试数据有多组
每组测试数据占一行,每行有两个数n和k (1<=n<=10^18; 0<=k<=100).

Output

每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。

Sample Input

1990 1
100 0
9090000078001234 6

Sample Output

9190
100
9907000008001234
这道题目我刚开始想的是从前往后扫,扫出最大的就往前移。但是有很多的数据是错的,所以我就想是从前往后扫是一个,从后往前扫是一个,比较大小再输出较大的。
但是还是WA。我就是去问了队友是怎么做的,他说是从前往后扫+从大往小扫。恩,理解之后这道题就很容易A掉了。
思路:
从第1位开始扫第1位到第k位,扫除最大的往前移,然后k减去移动的次数。再次循环,直到第1位到第k位内所有的数都已无法再移动了,且k还不为0,那i++,就是一直循环下去。直到k为0或所有的数都无法再移动了(也就是i到了最后面了)就可以跳出循环。然后输出就是正确答案了。

代码如下:

#include <stdio.h> #include <string.h> struct pp { char a[30]; int b[30]; }num; int l; int main() { int i, j, ln, max; int get_max(int x, int y); void change(int x); while (scanf("%s %d", num.a, &l) !=EOF) { ln=strlen(num.a); memset(num.b, 0, sizeof(num.b)); for (i=0; i<ln; i++) { if(l==0) break; if(l>=ln) max=get_max(i, ln-1); else max=get_max(i, i+l); if(max==-1) continue; if(max!=0 && num.a[max]>num.a[max-1]) change(max); else num.b[max]=1; } puts(num.a); memset(num.a, '0', sizeof(num.a)); } return 0; } int get_max(int x, int y) { int i, max, flag; for (i=x, flag=0; i<=y; i++) { if(!num.b[i] && !flag) { max=num.a[i]; flag=1; } if(!num.b[i] && flag) { if(num.a[max]<num.a[i]) max=i; } } if(flag) return max; else return -1; } void change (int x) { int t; char temp; if(x==0) return ; if(l==0) return ; if(num.a[x]>num.a[x-1]) { temp=num.a[x]; num.a[x]=num.a[x-1]; num.a[x-1]=temp; t=num.b[x-1]; num.b[x-1]=num.b[x]; num.b[x]=t; l--; change(x-1); } }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值