描述
请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,
比如当n=92081346718538,m=10时,则新的最大数是9888
-
输入
- 第一行输入一个正整数T,表示有T组测试数据
每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)
输出 - 每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数 样例输入
-
2 92081346718538 10 1008908 5
样例输出 -
9888 98
第一种方法:
#include<iostream> #include<string> #include<stdlib.h> #include<cstdio> using namespace std; int main() { string st; int n,m; char ans[110]; scanf("%d",&n); while(n--){ cin>>st>>m; int L=st.size(); for(int i=0,p=-1;i<L-m;i++) { int max=0; for(int j=p+1;j<=m+i;j++) { if(max<st[j]){max=st[j]; p=j;} } ans[i]=max; } ans[L-m]='\0'; puts(ans); } system("pause"); return 0; }
第二种方法:
#include <stdio.h> #include <string.h> int main() { int t; scanf("%d",&t); while (t--) { int m,n,z,i,j,x=0,c; char a[100]; scanf("%s%d",a,&m); n=(int)strlen(a); z=n-m; char b[z+1]; b[z]='\0'; for (i=x; i<z; i++) { b[i]=a[x]; c=x; a[0]='0'; for (j=c; j<m+1; j++) { if (b[i]<a[j]) { b[i]=a[j]; x=j; a[x]='0'; } } m++; } printf("%s\n",b); } return 0; } 两种方法都不错,还要继续加把劲,贪心,就是遵循某种规则,不断贪心的选取当前最优策略,注重细节,慎重!