题意:
给你一个大小为n序列,要求该序列分解成若干块,这若干块升序排列的时候要和原来大小为n的升序序列相同,问你最多可以分成多少块。
题解:
想了一晚上,要分块并且保持升序的话,必须是下一块的最小值大于当前块的最大值,但是我不相信我的思路是不是对的,所以躺在床上不敢去写,然后看了题解。。才发现我的思路是对的,,所以说,不要怕错,最重要是肯写。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=100000+7;
int a[MAXN],MAX[MAXN];
int main()
{
int n;
while(~scanf("%d",&n))
{
MAX[0]=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
MAX[i+1]=max(MAX[i],a[i]);//向右边移动一位,就可以与下面的实现min[i+1]与max[i]进行比较
}
int ans=0,MIN=1e9;
for(int i=n-1;0<=i;i--)//为什么从后面算最小值,你想一下,这组数据:5 6 7 8 9 1,就知道了
{
MIN=min(MIN,a[i]);
if(MIN>=MAX[i])
ans++;
}
printf("%d\n",ans);
}
}