看试卷
题目描述
在一次考试之后,作为班主任的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;
}
思路
模拟栈。