AtCoder - arc006_3

topic

I kept WA at the beginning, but found that the final answer of vjudge had to wrap, just simulate this question

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <algorithm>
#define MAX 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n,m,k;
int a[100001];
vector<int>s[100001];
int main()
{
    
    
    cin>>n;
    int cnt = 1;
    for(int i = 0 ;i < n ; i ++)
        cin>>a[i];
    int mmax = a[0];
    s[0].push_back(a[0]);
    for(int i = 1 ; i < n ; i++)
    {
    
    
        if(a[i] > mmax)//要放的箱子比所有堆的最上方箱子都要重,要重新放一堆
        {
    
    
            s[cnt++].push_back(a[i]);
            mmax = a[i];
        }
        else{
    
    //可以放在之前的某个堆中
            int idx = -1;
            int mmin = MAX;
            for(int j = 0 ; j < cnt ; j++)
            {
    
    
                if(s[j][s[j].size() - 1] >= a[i] && s[j][s[j].size() - 1] < mmin)
                {
    
    
                    mmin = s[j][s[j].size() - 1];
                    idx = j;
                }
            }
            s[idx].push_back(a[i]);
            int mm = -1;//更新mmax
            for(int j = 0 ; j < cnt ; j++)
                if(s[j][s[j].size() - 1] > mm)
                    mm = s[j][s[j].size() - 1];
            mmax = mm;
        }
    }
    cout<<cnt<<endl;
    return 0;
}

Guess you like

Origin blog.csdn.net/qq_43567222/article/details/114705288