先试着暴力一下,中间稍微剪枝去除重复数字,但是不出意料还是70分。
#include<bits/stdc++.h>
using namespace std;
int find(vector<int> &num,int index)
{
int result=0;
if(index)
for(int i=0;i<num.size();i++)
{
if(num[i]>=index&&(i==0||num[i-1]<index))
result++;
}
else
for(int i=0;i<num.size();i++)
{
if(num[i]!=0&&(i==0||num[i-1]==0))
result++;
}
return result;
}
int main()
{
int n;
cin>>n;
int mymax=0;
vector<int> num(n,0);
for(int i=0;i<n;i++)
{
cin>>num[i];
}
vector<int> tmp(num.begin(),num.end());
sort(tmp.begin(),tmp.end());
for(int i=0;i<n;i++)
{
if(i==0||tmp[i]!=tmp[i-1])
{
int index=tmp[i];
mymax=max(mymax,find(num,index));
}
}
cout<<mymax;
return 0;
}
满分代码:差分+后缀和
#include<bits/stdc++.h>
using namespace std;
const int N=500005;
int main()
{
int n;
cin>>n;
int num[N];
int cnt[10005]={0};
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
num[0]=num[n+1]=0;
n=unique(num,num+n+2)-(num);
for(int i=1;i<n;i++)
{
int x=num[i-1];
int y=num[i];
int z=num[i+1];
if(y>x&&y>z) cnt[num[i]]++;
if(y<x&&y<z) cnt[num[i]]--;
}
int res=0;
int sum=0;
for(int i=10004;i>=0;i--)
{
sum+=cnt[i];
res=max(sum,res);
}
cout<<res;
return 0;
}