PROBLEM-FIVE | ||||||
| ||||||
Description | ||||||
从键盘输入一个高精度正整数N(N不超过200位),任意去掉S个数字,把剩下的数字组合成一个新的正整数,次序不变且剩下的数字组成的新数最小。 | ||||||
Input | ||||||
有多组测试数据,每组测试数据占一行,这一行包括正整数N和S。0<=N≤10^200,S≤10,并且N的位数大于等于S | ||||||
Output | ||||||
输出这个新整数并换行 | ||||||
Sample Input | ||||||
1011 2
| ||||||
Sample Output | ||||||
1 | ||||||
Hint | ||||||
注意:新整数忽略前导0 | ||||||
Source | ||||||
新生练习赛(2013.11.10) | ||||||
Author | ||||||
hrbust |
思路:因为我们去除S之后的长度是一定的,所以我们得到的序列长度也就是一定的,所以我们贪心尽量让得到的结果是递增的,从第一个数字开始就尽量保证小。
AC代码:
#include<stdio.h>
#include<string.h>
char a[5002];
int k;
int main()
{
while(~scanf("%s%d",a,&k))
{
int len=strlen(a);
int i=0;
while(k)
{
int j;
for(j=i;a[j]!='\0';j++)
{
if(a[j]<=a[j+1])continue;
else break;
}
int l;
for(l=j;a[l]!='\0';l++)
{
a[l]=a[l+1];
}
a[l]='\0';
k--;
}
int ok=1;
int f=0;
for(int i=0;a[i]!='\0';i++)
{
if(a[i]!='0')f++;
if(a[i]=='0'&&f==0)continue;
printf("%c",a[i]);
ok=0;
}
if(ok==0)
printf("\n");
else
{
printf("0\n");
}
}
}