NYOJ-851寻找最大数(二),栈贪心!
寻找最大数(二)
- 描述
-
给你一个数字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寻找最大数(二),栈贪心!的更多相关文章
- nyoj 448 寻找最大数(贪心专题)
寻找最大数 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...
- nyoj 448 寻找最大数
寻找最大数 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...
- nyoj 寻找最大数(二)
寻找最大数(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给你一个数字n(可能有前缀0). 要求从高位到低位,进行 进栈出栈 操作,是最后输出的结果最大. ...
- 寻找最大数--nyoj题目448
寻找最大数 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...
- NYOJ-448 寻找最大数(贪心)
NYOJ-448 寻找最大数 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920 ...
- NYOJ448寻找最大数,贪心~~
寻找最大数 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538 ...
- NYOJ448_寻找最大数【贪心】
寻找最大数 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比方当n=920813467185 ...
- NYOJ-1057 寻找最大数(三)(贪心)
寻找最大数(三) 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数. 求这个新的整数的 ...
- nyoj 寻找最大数
寻找最大数 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...
随机推荐
- vijos1846 [NOIP2013] 华容道【最短路】
传送门:https://vijos.org/p/1983 (其实noip的题各个oj都会有的,就不贴其它传送门了) 这道题真的是,怎么说,我都不知道怎么评价了= =.果然数据量小的题怎么暴力都可以过. ...
- 人工智能(七)逻辑Agent
一.逻辑 逻辑是一种可以从中找出结论的形式化语言. 句法(规则)用语言定义句子. 语义定义句子的含义.定义一个句子的真假性. 二.蕴含 即一个事情逻辑上是另一个事情的必然结果:KB ╞ α 知识库KB ...
- DP(两次) UVA 10163 Storage Keepers
题目传送门 /* 题意:(我懒得写,照搬网上的)有n个仓库,m个人看管.一个仓库只能由一个人来看管,一个人可以看管多个仓库. 每个人有一个能力值pi,如果他看管k个仓库,那么所看管的每个仓库的安全值为 ...
- 尺取法 POJ 3601 Subsequence
题目传送门 /* 题意:求连续子序列的和不小于s的长度的最小值 尺取法:对数组保存一组下标(起点,终点),使用两端点得到答案 1. 记录前i项的总和,求[i, p)长度的最小值,用二分找到sum[p] ...
- ACM_折线中点
折线中点 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一 ...
- spark yarn cluster模式下任务提交和计算流程分析
spark可以运行在standalone,yarn,mesos等多种模式下,当前我们用的最普遍的是yarn模式,在yarn模式下又分为client和cluster.本文接下来将分析yarn clust ...
- sdut1283Five in a Row, Again
一简单的状压题 比赛时跑偏了 ,脑子最近乱的跟浆糊似得呢.. #include <iostream> #include<cstdio> #include<cstring& ...
- [转]无废话SharePoint入门教程一[SharePoint概述]
本文转自:http://www.cnblogs.com/iamlilinfeng/p/3026332.html 一.前言 听说SharePoint也有一段时间了,可一直处在门外.最近被调到ShareP ...
- js几个逻辑运算符的形象概括
“&&”是逻辑与操作符,只有“&&”两边值同时满足(同时为真),整个表达式值才为真. b>a && b<c //“&& ...
- vb,wps,excel 提取括号的数字
Sub 抽离数字() Dim hang Range("h1").Select Columns("E:F").Select Selection.Clear Ran ...