寻找最大数(二)

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

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

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

输入
有多组测试数据。

对于每组数据,输入一个n(0<=n<=10^100).
输出
输出栈操作后的结果。
样例输入
789
75948
样例输出
987
98457
提示
(用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;
}

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

NYOJ-851寻找最大数(二),栈贪心!的更多相关文章

  1. nyoj 448 寻找最大数(贪心专题)

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...

  2. nyoj 448 寻找最大数

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...

  3. nyoj 寻找最大数(二)

    寻找最大数(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给你一个数字n(可能有前缀0). 要求从高位到低位,进行 进栈出栈 操作,是最后输出的结果最大.   ...

  4. 寻找最大数--nyoj题目448

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...

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

    NYOJ-448 寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920 ...

  6. NYOJ448寻找最大数,贪心~~

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538 ...

  7. NYOJ448_寻找最大数【贪心】

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比方当n=920813467185 ...

  8. NYOJ-1057 寻找最大数(三)(贪心)

    寻找最大数(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数. 求这个新的整数的 ...

  9. nyoj 寻找最大数

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...

随机推荐

  1. Android系统的启动流程

    手机启动后首先会通过执行BootLoader来启动Linux内核,BootLoader是所有嵌入式设备开机启动执行的第一行代码,linux内核在启动过程中会加载各种设备的驱动同时初始化数据结构,并且开 ...

  2. java 对象流的简单使用

    对象的输入输出流的作用: 用于写入对象 的信息和读取对象的信息. 使得对象持久化.   ObjectInputStream   : 对象输入流   ObjectOutPutStream  :对象输出流 ...

  3. SQLServer 2012 高效分页

    SQLSERVER2012 出新分页功能啦!!!近两天我在自己工作机的PC(没有并发,单一线程)上做了SqlServer  2000/ (2005/2008)/2012三个版本下的分页性能比较. 大致 ...

  4. mysql之流程控制

    目录 分支结构 循环结构 分支结构: 1.if condition then [statement] elseif condition then [statement] else [statement ...

  5. php debug/phpstorm调试

    apache+phpstorm调试php代码,修改php.ini配置文件开启调试,没有以下代码加上即可, [XDebug]zend_extension="C:\php\php-7.0.12- ...

  6. php(一)

    PHP (Hypertext preprocessor 超文本预处理器) 1.环境工具 Xampp等工具 2.apache配置 默认的Apache路径是  c:/xampp/apache 文件夹 可以 ...

  7. Android 给按钮添加监听事件

    在安卓开发中,如果要给一个按钮添加监听事件的话,有以下三种实现方式 1.方式一 public class MainActivity extends ActionBarActivity { @Overr ...

  8. git介绍与使用

    git是去中心化版本管理工具,项目创建一个远程版本,将其clone到本地,会在本地创建一个本地仓,一个开发项目,在没有网络的时候依然可以提交修改到本地仓,当有网络的时候再提交到远程仓库.git可以快速 ...

  9. leetcode:single-number-ii(Java位运算)

    题目 Given an array of integers, every element appears three times except for one. Find that single on ...

  10. vb,wps,excel 分裂

    Sub 分列() '以空格为分隔符,连续空格只算1个.对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integ ...