HDU 3183 A Magic Lamp
题意: 从长度为 n 的数字中去掉k个数字,问剩下的数字组成的数最小是多少。
分析:可以看成从原来的数字中找一个长度为n-k的子串并且最小。
每次从第 st 个位置到第k+top个位置中找到最小的一个数字
st 为上次找到的数子的后一位,top为当前已经找到的数字个数。
#include <stdio.h> #include <string.h> int main() { char s[1005]; int res[1005]; int i, j, k; while(scanf("%s%d",s,&k)!=EOF) { int n = strlen(s); int top = 0; int st = 0; int en = k+top; int tt = 0; int g; while(top<n-k) { int tmp = 9; for(i = en; i >= st; i--) { if(s[i]-'0'<=tmp) { tmp = s[i]-'0'; g = i; } } res[top++] = tmp; st = g+1; en = k+top; } int flag = 0; for(i = 0; i < top ; i++) { if(flag || res[i]!=0){ printf("%d",res[i]); flag = 1; } } if(flag == 0) printf("0"); printf("\n"); } return 0; }