nyoj 寻找最大数

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nyoj 寻找最大数相关的知识,希望对你有一定的参考价值。

寻找最大数(二)

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

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

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

 

 
输入
有多组测试数据。
对于每组数据,输入一个n(0<=n<=10^100).
输出
输出栈操作后的结果。
样例输入
789
75948
样例输出
987
98457

思路:
贪心+栈;先找到最大的数字输出,然后再判断s1[n+1]位置的数字是否比栈顶的元素的数字大,(,要想输出的数值最大,每一位的数值都尽可能大的因为s[n+1]中存放的数字是后面的数字中最大的,语言可能能表达的有点不通顺......),如果不大,证明栈顶元素为后面元素中最大的,
输出栈顶元素,然后将栈顶元素弹出,此时栈顶元素的下一位置成为栈顶 ,在判断,,,重复上述步骤,所有元素都判断完了,将栈里面的元素按顺序输出,(也就是进栈的顺序,数字的顺序。。。)

#include <iostream>,
#include <stack>
#include <cmath>
using namespace std;

int main()
{
string s,s1;
stack <char>sta;
while(cin>>s)
{
s1=s;//算是一个标记数组,记录当前位置的数值为后面的位置(包含当前位置)的最大值
for(int i=0;i<s.length();i++)
for(int j=i;j<s.length();j++)
s1[i]=max(s1[i],s[j]);
for(int i=0;i<s.length();i++)//遍历整个字符串,求出最大的数
{
if(s[i]==s1[i])//如果当前的数值在后面的数值中为最大的
{
cout<<s[i];
while(!sta.empty()&&sta.top()>=s1[i+1])//判断栈顶的元素是否比下一个位置的数值大
{
cout<<sta.top();
sta.pop();
}
continue;//数字已经输出,不用再进栈
}
sta.push(s[i]);
}
while(!sta.empty())
{
cout<<sta.top();
sta.pop();
}
cout<<endl;
}
return 0;
}

以上是关于nyoj 寻找最大数的主要内容,如果未能解决你的问题,请参考以下文章

nyoj 寻找最大数

nyoj 811-变态最大值 (max)

NYOJ 571 —— 各种划分数

nyoj 1091 还是01背包(超大数)

nyoj 95-众数问题 (map)

NYOJ-914 Youth的最大化(贪心)