NBUT 1181 Big Mouth of Abyss - Kog'Maw(删k位留最大最小数)

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

你可能感兴趣的:(NBUT 1181 Big Mouth of Abyss - Kog'Maw(删k位留最大最小数))