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

来源:互联网 发布:李娜 歌手 知乎 编辑:程序博客网 时间:2024/06/06 01:15

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

原创粉丝点击