A - 删数问题
Description
键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。
Input
输入有多组 每组包括原始数n,要去掉的数字数s;
Output
输出去掉s个数后最小的数
Sample
Input
178543 4
Output
13
Hint
贪心算法的基础题型
注意事项(删除顺序的问题)
删除递减序列中的第一个数字并且要删除大的那个数字,从头寻找,不要在数组的持续寻找,第一个示例代码是wrong
#include <stdio.h>
#include <string.h>
int main()
{
int i,len,s;
char a[101];
while(~scanf("%s %d",a,&s))
{
while(s--)
{
i=0;
len=strlen(a);
while(i<len)//错误(一直在该序列中向下寻找)
{
if(a[i]<=a[i+1])
i++;
else
{
a[i]=a[i+1];
i++;
}
}
}
i=0;
len=strlen(a);
if(i<len)//注意输出形式
{
while(i<len&&a[i]=='0')//(假设00001)
i++;
if(i==len)//(假设9000已经把9删除了,只剩下了0)
printf("0");
for(; i<len; i++)
printf("%c",a[i]);
}
else//(最后没有位数)
printf("0");
printf("\n");
}
return 0;
}
以下为正确代码
#include <stdio.h>
#include <string.h>
int main()
{
int i,s,len;
char a[101];
while(~scanf("%s %d",a,&s))
{
while(s--)
{
i=0;
len=strlen(a);
while(i<len&&a[i]<=a[i+1])//直至找到递减的序列
i++;
while(i<len)//找到后删除干净,再找下一个序列
{
a[i]=a[i+1];
i++;
}
}
len=strlen(a);
i=0;
if(i<len)
{
while(i<len&&a[i]=='0')
i++;
if(i==len)
printf("0");
for(;i<len;i++)
printf("%c",a[i]);
}
else printf("0");
printf("\n");
}
return 0;
}