本题的难点无非是在第二问上,可用贪心,二分。
本人因为cnt++,这个点一直无法模拟不出来。
cnt为先用cnt这个值,之后再进行改变 切记!!!!
#include<iostream>
#include<algorithm>
#include<sstream>
#include<cstdio>
using namespace std;
const int N =1010;
int n;
int h[N],f[N],q[N];
int main()
{
string line;
getline(cin,line);
stringstream ssin(line); //输入流
while(ssin>>h[n]) n++; //while(cin>>q[n]) n++;
int res=0,cnt=0;//表示现在有多少个序列
for(int i=0;i<n;i++)
{
f[i]=1;
for(int j=0;j<i;j++)
if(h[i]<=h[j])
f[i]=max(f[i],f[j]+1);
res=max(res,f[i]);
}
for(int i=0;i<n;i++) //模拟的过程好像是类似与双指针算法。
{
int k=0; //可以看成是分组,但并不能真正的看成是分组
while(k<cnt&&q[k]<h[i]) //k不断加一,直到搜索到不满足条件,并将当前的h[i]赋值为q[k];
k++;
q[k]=h[i]; //不断地将相邻的数进行比较,
if(k>=cnt) q[cnt++]=h[i]; //开辟一个新的组 //如果满足while条件,则显示存在这个数大于上一个数,
}
cout<<res<<endl;
cout<<cnt<<endl;
return 0;
}