zoukankan      html  css  js  c++  java
  • 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


    #include<stdio.h>
    #include<string.h>//memset,gets
    #define N 110
    //bool visit[N];//以防两数在两个区间都是最大值
    char str[N];
    int main()
    {
    int i;
    int m,n,max, start,T,p;
    //memset(str,0,sizeof(str));//否则用strlen不准确
    scanf("%d",&T);
    while(T--)
    {
    //memset(visit,0,sizeof(visit));
    while(1)
    {
    scanf("%s %d",str,&n);//题目有要求首位不为0
    if(str[0]!=0)
    break;
    }
    //gets(str);
    //for(i=1;i<=m;i++)‘’;,
    //scanf("%c",&str[i]);
    m=strlen(str);
    p=m-n;
    start=0;
    while(p)
    {
    max='0'-1;
    for(i=start; i<=m-p; i++)
    {
    if(max<str[i])
    {
    max = str[i];
    start = i+1;
    }
    //visit[start] = true;
    }
    printf("%c",max);//不是%d
    --p;
    }printf("\n");
    //for(i=0;i<l;i++)
    //if(visit[i])
    /*例如56853217 5,第一次出来8,第二次应该是6,而
    6在8前面,所以输出语句应该在for内,不应该在用上面我屏蔽掉的for */
    //putchar("\n");
    }
    return 0;
    }

    /*注意:把l改成p把,免得l和1分不清
    贪心,每次在能够贪的区间找出最大字符,然后记录下一次是从最大字符的下标+1开始,所以start =
    i+1
    下次能贪的区间也就是:start ~ m-p
    p是记录已经贪了多少字符了,每贪一个,就p--

    错误代码:


    看错题啦,按原次序,靠,必须是贪心
    #include<stdio.h>
    #include<string.h>//memset,gets
    #define N 101
    bool visit[N];//以防两数在两个区间都是最大值
    char str[N];
    bool Max(char a,char b)
    {
    if(a>=b)
    return true;
    return false;
    }
    int main()
    {
    int i,j;int T,l;int m,n,max;
    memset(visit,0,sizeof(visit));
    //memset(str,0,sizeof(str));//否则用strlen不准确
    scanf("%d",&T);
    while(T--)
    {
    while(1)
    {
    scanf("%s %d",str,&n);//题目有要求首位不为0
    if(str[0]!=0)
    break;
    }
    //gets(str);
    //for(i=1;i<=m;i++)
    //scanf("%c",&str[i]);
    l=strlen(str);
    for(i=0;i<l-n;i++)
    {
    max='0';
    for(j=i;j<n+1+i;j++)
    if(Max(str[j],max)&&!visit[j])
    max=str[j];
    visit[j-1]=true;
    printf("%c",max);//不是%d
    }
    //for(i=0;i<l;i++)
    //if(visit[i])
    /*例如56853217 5,第一次出来8,第二次应该是6,而
    6在8前面,所以输出语句应该在for内,不应该在用上面我屏蔽掉的for */

    //putchar("\n");
    printf("\n");
    }
    return 0;
    }


    //.cpp:56 [Warning] no newline at end of file
    /*
    这么规定的初衷有两个:

    为了每一行都要以换行结束。
    因为行尾的\表示连接下一行,如果一个文件最
    后一行行尾有\,那么,紧跟它也被包含进来的下一个源文件的第一行就会
    被连接!而如果一个文件以一个空行结束就会避免这种情况的发生。*/

  • 相关阅读:
    java 接口中的成员变量与方法
    Spring BeanPostProcessor
    MySQL更改命令行默认分隔符
    java 动态代理
    《剑指offer》:[62]序列化二叉树
    group by语法
    Mysql两种引擎
    线程池大小设置
    Synchronized及其实现原理
    CAS ABA问题
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2453481.html
Copyright © 2011-2022 走看看