寻找最大数(二)

时间限制: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. Activity状态图、生命周期图(超详细),onSaveInstanceState只保存、恢复基本ui数据,持久数据不在这里保存。

    1.Activity状态图 2.Activity生命周期简图 启动Activity: onCreate()—>onStart()—>onResume(),Activity进入running ...

  2. JUnit单元测试&注解

    ①测试方法上必须使用@Test进行修饰 ②测试方法必须使用public void 进行修饰,不能带任何的参数 ③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开 ④测试类所在的包 ...

  3. [转]在ASP.NET MVC3中使用EFCodeFirst 1.0

    本文转自:http://kb.cnblogs.com/page/97003/ 作者: NinoFocus  来源: 博客园  发布时间: 2011-04-12 10:41  阅读: 11971 次   ...

  4. 技术杂记之:vi使用入门

    对于Linux的初次使用者来说,进入Linux非图形界面后,不知道怎么创建文本(甚至于在图形界面,也找不到创建文本的菜单).其实,每一个Linux的发行版本,都包含了一个最简单.也是最基础的文本编辑器 ...

  5. FreeMarker-网页静态化

    网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道. 网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规 ...

  6. [BZOJ4815][CQOI2017]小Q的表格 数论+分块

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4815 题目中所给条件中的$(a,a+b)$和$(a,b)$的关系很瞩目. 然后大家都知道$ ...

  7. Activity的四种启动模式区别

    (1) standard 模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中. (2) singleTop 如果在任务的栈顶正好存在该Activity的实例, 就重用该实 ...

  8. Linux下PPPoE Server测试环境搭建

    1.1  服务器软件安装 安裝PPPoE Server 所需的软件: 安装ppp模块: sudo apt-get install ppp   //一般默认下已安装 安装rp-pppoe,从网络上下载安 ...

  9. Vuex的全面用法总结

    1. vuex简介 vuex是专门用来管理vue.js应用程序中状态的一个插件.他的作用是将应用中的所有状态都放在一起,集中式来管理.需要声明的是,这里所说的状态指的是vue组件中data里面的属性. ...

  10. git的使用 及一些常见的错误处理

    git安装使用 添加文件到Git仓库,分两步: 1.使用命令git add <file>,注意,可反复多次使用,添加多个文件: 2.使用命令git commit -m <messag ...