1. 程式人生 > >nyoj 尋找最大數(二)

nyoj 尋找最大數(二)

out 數字 esp 數據 time return tin while 標記

尋找最大數(二)

時間限制: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 尋找最大數(二)