4 solutions

  • 3
    @ 2022-1-2 15:43:30

    利用multiset记录和删除出入库车的价值,利用它可以排序的特点记录最大价值

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        stack <int> s;
        multiset <int> v;
        int n;
        cin>>n;
        while(n--)
        {   
        	int p,x;
        	cin>>p;
        	switch(p)
        	{
        		case 1:cin>>x;
    			  		s.push(x);
    			  		v.insert(x);
    					break;
        		case 2:if(!s.empty()) 
    			      { 	//出库时在v中找到并删除相应的价值
    				    	v.erase(v.find(s.top()));
    				        s.pop();
    			      }
    			      break;
    			case 3:	
    			  !s.empty()?cout<<*(--v.end())<<endl:cout<<"-1"<<endl;
    			  //判断车库是否为空,没空就输出-1,空的就输出v的最后一个数字(最大)
                  //*(--v.end())为输出v最后一个数字,可以用迭代器替换
    			  break;
    		}
    	}
        return 0;
    }
    
    • 1
      @ 2022-4-20 19:22:12

      把每次放入的车直接更新成栈中的最大值

      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e6+7;
      int SS[N],top=-1;
      int n,k,v,maxx=0;
      int main() {
      	scanf("%d",&n);
      	while(n--){
      		scanf("%d",&k);
      		if(k==1){
      			scanf("%d",&v);
      			if(v>maxx)SS[++top]=v,maxx=v;
      			else SS[++top]=maxx;
      		}else if(k==2){
      			maxx=SS[--top];
      		}else{
      			if(top==-1) printf("%d\n",-1);
      			else printf("%d\n",SS[top]);
      		}
      	}
      	return 0;
      }
      
      • 0
        @ 2022-10-25 21:29:43

        双栈,另外一个栈贮存最大值

        #include<bits/stdc++.h>
        using namespace std;
        #define ll long long
        stack<ll> s;
        stack<ll> m;\\储存最大值
        int main(){
            int k,x;
            ll mm;
            m.push(0);\\使m.top()一开始就存在
            while(scanf("%d",&k)!=EOF){
                for(int i=0;i<k;i++){
                    cin>>x;
                    if(x==1){
                        ll a;
                        cin>>a;
                        s.push(a);
                        mm=max(a,m.top());
                        m.push(mm);
                    }
                    else if(x==2){
                        s.pop();
                        m.pop();
                    }
                    else if(x==3){
                        if(m.top()!=0){
                            cout<<m.top()<<endl;
                        }else{
                            cout<<-1<<endl;
                        }
                    }
                }
            }
        }
        
        • 0
          @ 2022-3-24 17:54:01

          水题

          #include<bits/stdc++.h>
          using namespace std;
          int path[100000];
          int t,num,car,i;
          void search(int []){
          	int ans=0;
          	for(int j=0;j<i;j++)
          	{
          		if(path[j] > ans)
          			ans = path[j];	
          	}
          	if(ans == 0)
          		cout<<-1<<endl;
          	else
          		cout<<ans<<endl;
          }
          int main() {
          	std::ios::sync_with_stdio(false);
          	cin>>t;
          	while(t--){
          		stack<int> cnt;
          		cin>>num;
          		if(num == 1){
          			cin>>car;
          			path[i++] = car;
          			cnt.push(car);
          		}
          		else if(num == 2){
          			cnt.pop();
          			i--;
          			path[i]=0;
          		}
          		else
          			search(path);
          	}
              return 0; 
          }
          
          • 1

          Information

          ID
          1528
          Time
          1000ms
          Memory
          256MiB
          Difficulty
          5
          Tags
          # Submissions
          73
          Accepted
          23
          Uploaded By