目录
一. 题目描述
Problem Description
键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。
Input
输入有多组 每组包括原始数n,要去掉的数字数s;
Output
输出去掉s个数后最小的数
Sample Input
178543 4
Sample Output
13
二. 题解及代码
注意题目要求删掉s个数字后,剩下数字按照原来次序排列构成的最小数字!直接删掉s个最大的数字是行不通的,比如1553789删掉2个数字,按照该思路结果应该为15537,但是这并不是最小的,而13789才是最小的(删掉了55),因此贪心规则如下:
- 删数顺序应该为从高位往低位删
- 删掉s个数字后,所有的数字位数都是一样的,则前面的数字越小越好
- 应该删掉前面的较大的数字
综上所述,在数字由高位到低位的过程中,应按照升序将数字最后一位删掉;若一直升序,则删掉最后一个数字。
#include <stdio.h>
#include<string.h>
char num[101];
int main() {
while(scanf("%s",num)!=EOF) {
int s;
scanf("%d",&s);
getchar();
int i,j;
int k=strlen(num);
if(k!=s) {
while(s>0) {
i=0;//重新开始判断
while(num[i]<=num[i+1]&&i<strlen(num))i++;//找到升序的最后一个数字,注意<=
//删掉这个数字
for(j=i; j<strlen(num); j++){
num[j]=num[j+1];
}
s--;//要删掉的数字--
}
i=0;
while(num[i]=='0')i++;//删去前导零
if(i==strlen(num)) printf("0");
else
for(j=i; j<strlen(num); j++)
printf("%c",num[j]);
printf("\n");
}
}
return 0;
}