1.题目:合唱队
合唱队的N名学生站成一排且从左到右编号为1到N,其中编号为i的学生身高为Hi。
现在将这些学生分成若干组(同一组的学生编号连续)
并让每组学生从左到右按身高从低到高进行排列
使得最后所有学生同样满足从左到右身高 从低到高(中间位置可以等高),
那么最多能将这些学生分成多少组?
第一行包含一个整数N,1≤N≤10^5。
第二行包含N个空格隔开的整数H1到HN,1≤Hi≤10^9。
输入:
4
2 1 3 2
输出
2
2.Code
判断index处是否能够切开还是需要判断比arr[index]小的元素是否都出现在index的前面。
问题转化:寻找[index+1,n-1]区间值是否都大于[0,index]区间值
即[index+1,n-1]的min值 > [0,index]的max值
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
int a[maxn];
int minn[maxn];
int maxx[maxn];
int getMin(int a, int b){
return a < b ? a : b;
}
int getMax(int a, int b){
return a > b ? a : b;
}
int main()
{
int n;
while(cin>>n)
{
for(int i = 1; i <= n; ++i){
cin>>a[i];
}
minn[n] = a[n];
for(int i = n-1; i >= 1; i--){
minn[i] = getMin(minn[i+1],a[i]);
}
//test
cout<<"minn: ";
for(int i = 1; i <= n; ++i){
cout<<minn[i]<<" ";
}
cout<<"\n";
maxx[1] = a[1];
for(int i = 2; i <= n; ++i){
maxx[i] = getMax(maxx[i-1],a[i]);
}
//test
cout<<"maxx: ";
for(int i = 1; i <= n; ++i){
cout<<maxx[i]<<" ";
}
cout<<"\n";
int res = 1;
for(int i = 2; i <= n; ++i){
if(maxx[i-1] <= minn[i])
res++;
}
cout<<res<<endl;
cout<<"\n";
}
return 0;
}
/*
in
5
5 4 3 2 1
out
1
in
4
2 1 3 2
out
2
in
5
2 1 3 4 4
out
4
*/