單調棧--刪除一串數字的k個數使最後結果最小

題目:http://betterang.club/problem.php?id=1205

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll t,k,p=1,len;
void slove(){
    stack<char> m,n;//單調棧 
    string c;
    vector<int> s;//爲什麼用vector? 因爲數太多-_- 
    cin>>c;
    cin>>k;
    len=c.length();
    for(ll i=0;i<len;i++){
        if(m.empty()) 
		   m.push(c[i]);
        else{
        	while(!m.empty() && m.top()>c[i] && len-k-m.size()<len-i ){//棧頂元素比當前數大且保證剩下的數足夠就pop 
    	    	m.pop();
		    }
		    m.push(c[i]);
		}
       
	}
	while(m.size()>len-k) m.pop();//保證棧中有len-k個元素 
	while(!m.empty()){//由於棧元素的先進後出 所以要把棧中元素倒置才能將所求結果存在數組s中 
		//cout<<m.top();
	  n.push(m.top());
	  m.pop();	
	}
	ll flag=1;
	while(!n.empty()){
		if(n.top()=='0' && flag==1) {//如果結果最前面是0就不用存了呀 
			n.pop();
		}
		else{
			flag=0;
			s.push_back(n.top()-'0');
			n.pop();
		}
	}
	if(flag==1) //如果結果中只有0 
	   cout<<0<<endl<<233<<endl;
	else{
		ll p=s.size();
		for(ll i=0;i<p;i++) cout<<s[i];
		cout<<endl;
		if(p>3){
		s[p-1]+=3;
		s[p-2]+=3;
		s[p-3]+=2;
	    
		for(ll i=p-1;i>0;i--){
			if(s[i]>9) {
				s[i-1]+=s[i]/10;s[i]%=10;
			}
		}
		if(s[0]>9) {//考慮最高位進位 
			cout<<s[0]/10;
			s[0]%=10;
		}
		for(ll i=0;i<p;i++){
			cout<<s[i];
		}
		
	  }
	  else{
	  	ll sum=0;
	  	for(ll i=0;i<p;i++){
	  		sum=sum*10+s[i];
		  }
		  cout<<sum+233<<endl;
	  }
   }
}
int main(){
		slove();
   return 0;
} 

/*
1023004  3
4
237

1003 2
0 
233

145759411 1
14559411
14559644

99999 1
9999
10232 
 
*/ 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章