nyoj 尋找最大數(二)
阿新 • • 發佈:2018-03-31
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 尋找最大數(二)