看试卷

题目描述

在一次考试之后,作为班主任的T老师需要给n个学生改卷子,T老师有个习惯,就是按学号的先后来看卷子,所以T老师每次看卷子之前都需要给卷子排好先后次序再改。
但是因为T老师的空闲时间很短,所以他想尽量把这个排序的任务分成多次来做。因此他请你将卷子分成一小叠一小叠的(但不打乱卷子现有顺序),使得她只需要对每一叠分别排序,就能将整堆卷子排序。
初始的卷子次序为a[i],请问你最多能把卷子分成多少小叠。
保证卷子上面的学号为0...n-1的一个排列。

输入

第一行一个数n;
第二行n个数表示a[i],以空格隔开。

输出

输出一个数,表示最多分出多少叠卷子。

样例输入

5 
4 3 2 1 0

样例输出

1

提示

将卷子分成2叠或者更多块,都无法得到所需的结果。
例如,分成 [4, 3], [2, 1, 0] ,排序得到的结果是 [3, 4, 0, 1, 2],这不是有序的数组。

对于20%的数据,1≤n≤20;
对于53%的数据,1≤n≤1000;
对于60%的数据,1≤n≤2000;
对于100%的数据,1≤n≤100000。

代码

//#pragma GCC optimize(3)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<climits>
#include<queue>
#include<set>
#include<stack>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define swap(x,y) (x^=y,y^=x,x^=y)
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int mod=1e9+7;
int a[N];
stack<int>st;
template<typename T>inline void read(T &x)
{
    x=0;
    T f=1;
    char c=getchar();
    for(; c<'0'||c>'9'; c=getchar()) if(c=='-') f=-1;
    for(; c>='0'&&c<='9'; c=getchar()) x=(x<<1)+(x<<3)+(c&15);
}
template<typename T>inline void print(T x)
{
    if(x<0) putchar('-'),x*=-1;
    if(x>=10) print(x/10);
    putchar(x%10+'0');
}
int main()
{
    int n;
    read(n);
    for(int i=0;i<n;i++)
        read(a[i]);
    int minn=0,maxn=0;
    int mina=INT_MAX,maxa=0;
    int cnt=0,num=0,toj=0;
    for(int i=0;i<n;i++)
    {
        maxn=i;
        maxa=max(maxa,a[i]);
        mina=min(mina,a[i]);
        num++;
        if(mina==minn&&maxa==maxn)
        {
            cnt++;
            toj+=num;
            num=0;
            minn=i+1;
            mina=INT_MAX;
        }
 
    }
    if(toj==n){
        print(cnt);
        cout<<endl;}
    else
        cout<<1<<endl;
}

思路

模拟栈。

猜你喜欢

转载自www.cnblogs.com/xxffxx/p/11795124.html