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