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
- NYOJ-851寻找最大数(二),栈贪心!
- 寻找最大数 NYOJ 贪心
- nyoj 448 寻找最大数(贪心)
- NYOJ 448 寻找最大数【贪心】
- nyoj 448寻找最大数(贪心)
- NYOJ 448 寻找最大数(贪心)
- NYOJ 448 寻找最大数 (贪心)
- NYOJ 448 寻找最大数(贪心)
- NYOJ 寻找最大数
- NYOJ 寻找最大数
- NYOJ-寻找最大数
- NYOJ-寻找最大数
- nyoj 寻找最大数
- nyoj 寻找最大数
- nyoj 1057 寻找最大数(三) 贪心
- NYOJ 1057 寻找最大数(三) (贪心)
- nyoj 1057寻找最大数(三) 贪心
- Num 27 : NYOJ : 0448 寻找最大数 [ 贪心 ]
- Android学习笔记030之RecyclerView和CardView实现拖拽和滑动
- POJ3254->状压DP
- C语言_结构体嵌套和字符串数组的表示_plusC14.3
- 程序“[4176] char.exe: 本机”已退出,返回值为 0 (0x0)
- Trie(字典树)学习小结1
- NYOJ-851寻找最大数(二),栈贪心!
- [javascript权威指南][阅读笔记]七
- idea修改文件头内容
- 图解win7下局域网内SVN服务器搭建
- 五大NAT穿透方法,解决内网问题
- iOS字符串反转
- 2016 07 18
- 【Linux全面学习】4.Linux的目录结构
- 搜索时输入关键词进行匹配