贪心,删数问题
description |
给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列成一个新的正整数。 n (1<=n<=200)位的正整数a和k,k小于n。 |
input |
可输入多组测试数据,每组测试数据分两行,每行一个数,数的含义如下。 第一行:正整数a(a是大于0的一个n位正整数) 第二行:正整数k 以0来结束测试数据。 |
output |
输出每组测试数据所得出的删k位数之后的最小数。 若输出的数首位是0,无须理会,0也直接输出即可。例如:024,就直接输出024,无须改成24。 |
sample_input |
178543 4 87654321 2 123456789 1 254193 1 90249 2 0 |
sample_output |
13 654321 12345678 24193 024 |
/*个人觉着吧,这题主要得知道排列的方法,所以我们的思路得正确,这题呢,首先从前往后遍历,当遇到后面数小于前面数时便去掉前面的大数,这样去掉k次,中间如遇到递增序列情况,则去掉最后一个数字,剩下的便是答案啦。 以下附上代码供参考: */ #include <iostream> #include<algorithm> #include<stdio.h> #include<string.h> using namespace std; int main() { char a[300]; int k; while(scanf("%s",a)!=EOF) { if(strcmp(a,"0")==0) break; scanf("%d",&k); int l=strlen(a),t=k; while(k) { int j=strlen(a)-1,flag; for(int i=0;i<l-1;i++) { if(a[i]>a[i+1]) { flag=1;j=i;break; } } if(flag==1) { for(int i=j;i<l-1;i++) a[i]=a[i+1]; } k--; } for(int i=0;i<l-t;i++) cout<<a[i]; cout<<endl; } return 0; }
持续更新博客地址:
blog.csdn.net/martinue