NYOJ-851寻找最大数(二),栈贪心!

来源:互联网 发布:白金数据东野圭吾 编辑:程序博客网 时间:2024/05/16 01:01

寻找最大数(二)

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

给你一个数字n(可能有前缀0)。

要求从高位到低位,进行 进栈出栈 操作,是最后输出的结果最大。

 

输入
有多组测试数据。
对于每组数据,输入一个n(0<=n<=10^100).
输出
输出栈操作后的结果。
样例输入
78975948
样例输出
98798457
提示
(用0表示进栈,1表示出栈)
789 输出 987 过程是 000111
75948 输出 98457 过程是 0001001111

输出结果应该和输入位数相同

  题意很好懂,就是利用栈进出的顺序来求最大值,看样例就明白了,不过样例往往会错误地引导你(其实是自己考虑不周),按样例我开始的思路是每个位置往后找一位最大的数用另外一个数组存起来,如果此位置上的数与找到的不相等就入栈,相等则直接输出;最后再全部输出,呵呵,秒WA;看了讨论区12级学长亮哥(现在在百度音乐)给出了一个样例7584940,输出9485740;

   刚刚的思路输出9404857;明显错了,不过利用栈进出顺序确实可以得到9485740;所以在原先的思路上再加一步:如果当前位置上的元素是后面所有元素中最大的则输出(前提)并且如果栈顶元素比当前元素的后一位后面的所有元素都大则输出栈顶元素,重复判断栈顶元素;如果当前元素后面有比当前元素更大的则将当前元素入栈;

#include<bits/stdc++.h>using namespace std;const int N=1000;char a[N],b[N];//理解了b[]数组的意思就可以做了;int main(){    int i,j;    while(~scanf("%s",a))    {        int len=strlen(a);        strcpy(b,a);        for(i=0; i<len; i++)            for(j=i; j<len; j++)                b[i]=max(b[i],a[j]);//找到当前位置后面最大的(包括当前元素);        stack<char>q;        for(i=0; i<len; i++)        {            if(a[i]==b[i])//当前位置是后面所有元素中最大的;            {                printf("%c",a[i]);                while(!q.empty()&&q.top()>=b[i+1])//再重复判断栈顶元素与当前元素后面的后面所有元素的关系;                {                    printf("%c",q.top());                    q.pop();                }                continue;            }            q.push(a[i]);        }        while(!q.empty())        {            printf("%c",q.top());            q.pop();        }        printf("\n");    }    return 0;}

学长给出的样例果然厉害,只是每次做题考虑不全,样例只是所有情况中的一种;还有太急躁,等不及将思路理清就直接写,白浪费时间!


1 0