F - Nastya and Door
题意
n座山当高度大于左右两座称为峰,一个足够长的门倒下被山峰隔断,问k个长度最多隔断几段。
思路
先进行一次遍历,统计峰,两端不能为峰,再次遍历利用数组差得出段数选最大的。
代码
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,k,i;
cin>>n>>k;
int a[n+1],b[n+1]={0};//放在循环里。
for(i=1;i<=n;i++)cin>>a[i];
for(i=2;i<n;i++){
if(a[i]>a[i-1]&&a[i]>a[i+1])b[i]=1;//统计峰。
b[i]+=b[i-1]; //并且山要累计前面峰的数量做差就可以得到峰的数量。
}
int count,max=0,simi; //每一段i到i+k-之间的峰数。
for(i=1;i+k-1<=n;i++){
count=b[i+k-2]-b[i]+1; //i+k-1到i的有效峰数
if(count>max){
max=count;
simi=i;
}
}
cout<<max<<" "<<simi<<endl;
}
}