JDOJ 2898 删数问题
洛谷 P1106 删数问题
https://www.luogu.org/problemnew/show/P1106
JDOJ 2898: 删数问题
https://neooj.com:8082/oldoj/problem.php?id=2898
Description
输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。
输出新的正整数。(N不超过240位)输入数据均不需判错。
Input
【输入】
n
s
Output
最后剩下的最小数。
Sample Input
175438
4
Sample Output
13
HINT
例如:n=175438
s=4
删数的过程如下:
n=175438 //删掉7
15438 //删掉5
1438 //删掉4
138 //删掉8
13 //解为13
一道高精度加贪心的题。
这题的贪心策略就是怎么删除数字才能保证剩下的数最小。
原则上选择删除最大的数,但是明显不行。
如果把各位上的数做一个函数图象的话,应该删除峰顶的数,而且越靠前越好。
贪心原则出来了,接下来就是高精度的代码实现。
本人高精度很弱。
所以笨了吧唧地写出的代码,丑到不行。
但是钻了个空子,还是C语言榜单第一。
AC CODE:
#include<stdio.h> #include<string.h> char c[260]; int s,cnt; int main() { scanf("%s%d",c,&s); int len=strlen(c); while(s--) { for(int i=0;i<=len-2;i++) if(c[i]>c[i+1]) { for(int j=i;j<=len-2;j++) c[j]=c[j+1]; break; } len--; } while(cnt<=len-1 && c[cnt]=='0') cnt++; if(cnt==len) printf("0"); else for(int j=cnt;j<=len-1;j++) printf("%c",c[j]); return 0; }