NYOJ448_寻找最大数【贪心】

寻找最大数

时间限制:1000 ms  |  内存限制:65535 KB

难度:2

描述

请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,

比如当n=92081346718538,m=10时,则新的最大数是9888

输入

第一行输入一个正整数T,表示有T组测试数据

每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)

输出

每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数

样例输入

2

92081346718538 10

1008908 5

样例输出

9888

98

来源

第六届itat复赛B卷2题改编

上传者

ACM_赵铭浩

题目大意:……删去m位数,输出剩余的数字  使新数最大

思路:贪心思想。设位数为len,删去m位数,输出新数,就是输出新数为len-m位

根据贪心思想。从最高位开始,每次保证取出来的数字都是最优的。

比如说7位数,删去3位数。应该从第一位到第len-2位上取最大值。这样首先保证最高位

千位上的结果正确。再从刚才找到值的下一位开始到第len-1位上取最大值。保证百位上

的结果正确。再从刚才找到值的下一位开始到第len位上取最大值,保证各位上结果正确。

比如:9456973 4

因为要删去4个数,所以输出新数为3位。

从第一位9开始到第7-2=5位,找到千位上的最大值,并且尽可能靠左。找到第一位上的

第一个9,则千位为9。再从第二位4开始到第7-1位,找到百位上的最大值,找到第5位上

的第二个9。再从第6位开始到第7位,找到个位上的最大值,找到第6位上的7。

则输出结果为997.

#include<stdio.h>
#include<string.h>

char ch[110];
int main()
{
    int T,num;
    scanf("%d",&T);
    while(T--)
    {
        memset(ch,0,sizeof(ch));
        getchar();
        scanf("%s %d",ch,&num);
        int len = strlen(ch);
        num = len - num;
        int pos = 0;
        while(num > 0)
        {
            int max = -1;
            int j;
            for(j = pos; j <= len-num; j++)
            {
                if(ch[j]-'0' > max && ch[j]!='a')
                {
                    max = ch[j]-'0';
                    pos = j;
                }
            }
            printf("%c",ch[pos]);
            ch[pos] = 'a';
            num--;
        }
        printf("\n");

    }
    return 0;
}
时间: 2024-10-10 23:52:55

NYOJ448_寻找最大数【贪心】的相关文章

Num 27 : NYOJ : 0448 寻找最大数 [ 贪心 ]

一道经典的贪心问题:如题: 寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测试数据 每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次

NYOJ448 寻找最大数 【贪心】

寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测试数据 每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数 样例输入

NYOJ-448 寻找最大数(贪心)

NYOJ-448 寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测试数据每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大

NYOJ 1057 寻找最大数(三)(关于贪心算法的认识)

以前做贪心题目都第一步对数据进行从大到小的排序,大部分贪心题目的的处理方法也是这样.但是NYOJ的1057题,在解题中 并不需要排序,一时间都没有意识到是贪心题.在看了讨论区之后意识到要用贪心的思想,才解出题目.认识到贪心算法并非是排序后再处理的机械操作,而是从局部寻求最优解的思想. 原题如下: 寻找最大数(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数. 求这个新的整数的最大值

NYOJ 448 寻找最大数【贪心】

寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测试数据 每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数 样例输入

寻找最大数(贪心)

寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测试数据每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数 样例输入 2

寻找最大数(nyoj448)(贪心)

寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测试数据 每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数 样例输入

nyoj寻找最大数(三)

 /*寻找最大数(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数. 求这个新的整数的最大值是多少. 输入多组测试数据. 每组测试数据占一行,每行有两个数N和K (1≤N<=10^18; 0≤K≤100). 输出每组测试数据的输出占一行,输出移动后得到的新的整数的最大值.样例输入1990 1 100 0 9090000078001234 6 样例输出9190 100 99070

nyoj448 寻找最大数

寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测试数据 每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数 样例输入