题目链接: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;
}