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的位数)输出每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数样例输入

2

92081346718538 10

1008908 5

样例输出

9888

98





题目分析: 这个贪心算法就有点小难理解了,首先要分析从什么位置开始查找,因为查找过程还不能改变原来数字的顺序。

9  2  0  8  1  3  4  6  7  1  8  , 5   3    8     10

0  1  2  3  4  5  6  7  8  9  10  ,11  12  13

来看这个数据,上边是原数据,下边是数据在数组中的脚码,总长度为 14 那么去掉 10 位后还有4 位那么次4位数的首位一定是在分号也即是10号之前0号后的数字中产生此数字的位置记为 k 而且这个数还是这之间最大的数,想一想是不是。那么第2位数一定是在11号之前在k+1号之后产生对吧此数子的位置记为k,第3位一定是在12号之前k+1之后产生此数字位置记为k,第4位一定是在13号前k+1之后产生吧。就是这个思路下面代码就好理解了。



<span style="font-size:24px;">#include<cstdio>
#include<cstring>
int main()
{
  int T;
  scanf("%d",&T);
  while(T--)
  {
    char a[101];
    int m;
    scanf("%s%d",a,&m);
    int len=strlen(a);
    int weishu=len-m;
    int j=0,i,k=0;
    char max='0';
    while(k<weishu)
    {
      int max=0;
      for(i=j;i<=m+k;i++)// 此处i<=m+k 一定带有=号
      {
        if(max<a[i])
        {
          max=a[i];
          j=i;
        }
      }
      j++;k++;
      printf("%c",max);
    }
    printf("\n");
  }
  return 0;
}</span>









目录
相关文章
|
安全 关系型数据库 MySQL
Docker 进阶 发布自己的Docker镜像 将镜像上传到阿里云和Docker Hub
上传自己制作的docker镜像的方法,将docker镜像上传到Docker Hub,阿里云的两种方法,以及上传镜像时可能遇见的问题和解决办法,每一步的详解和上传镜像时的规范。
6541 0
Docker 进阶 发布自己的Docker镜像 将镜像上传到阿里云和Docker Hub
|
9月前
|
Java 测试技术
HDU-1232-畅通工程(未完待续)
HDU-1232-畅通工程(未完待续)
39 0
|
9月前
|
人工智能 Java
HDU-1003- Max Sum (动态规划)
HDU-1003- Max Sum (动态规划)
56 0
|
9月前
|
算法
NYOJ38-布线问题
NYOJ38-布线问题
34 0
|
9月前
HDU-2089-不要62
HDU-2089-不要62
49 0
|
9月前
|
Java
hdu-1869-六度分离(dijkstra)
hdu-1869-六度分离(dijkstra)
56 0
|
9月前
|
人工智能
B - Dima and To-do List
B - Dima and To-do List
51 0
|
9月前
|
Java 数据挖掘 知识图谱
HDU 1114 Piggy-Bank (完全背包)
HDU 1114 Piggy-Bank (完全背包)
49 0
|
9月前
poj-1611-The Suspects
poj-1611-The Suspects
40 0
|
9月前
|
Java
hdu-2546-饭卡
hdu-2546-饭卡
35 0