题目链接:Click here~~
题意:
神一样的题意。第一遍读题完全没搞懂要干啥。
其实就是给一串数字,删除k位后,不改变原顺序,要求留下的数字最小。
解题思路:
假设原数字的长度为l,即我们需要保留 l-k 位。
由感性认识,我们知道当高位数字越小时,所得结果越小。
依据这个思路,我们采用最简单的方法,以从高位向低位的顺序,一位一位的来选择保留哪位。
对于选择每一位的时候,由于不能改变数字的原顺序,所以我们要考虑选择的范围,即要为后面的数字留下足够的位数。
比如第一次选择的时候,我们需要给后面留下 l-k-1 个位置,如果设最后的数字下标是 l-1 ,则我们只能选择区间 [0,k] 中的元素。
选择完后,我们还要记录它的位置q,因为在下一次选择的时候,我们要从上次选择的数字后面开始,即[q+1,k+1]中的元素。
一般化以后,可以先初始化q为-1,则选择的区间每次都是[q+1,k+i]。( i 表示现在选择的是第几位,最高位是0)
#include <stdio.h> #include <string.h> int main() { int k,l,min; char s[10005],ans[10005]; while(~scanf("%s%d",s,&k)) { l = strlen(s); for(int i=0,q=-1;i<l-k;i++) { min = '9'+1; for(int j=q+1;j<=k+i;j++) { if(min > s[j]) min = s[j] , q = j; } ans[i] = min; } ans[l-k] = '\0'; puts(ans); } return 0; }
#include <stdio.h> #include <string.h> int main() { int k,l,max; char s[10005],ans[10005]; while(~scanf("%s%d",s,&k)) { l = strlen(s); for(int i=0,q=-1;i<l-k;i++) { max = 0; for(int j=q+1;j<=k+i;j++) if(max < s[j]) max = s[j] , q = j; ans[i] = max; } ans[l-k] = '\0'; puts(ans); } return 0; }