要求每段的点数都一样,因此分的段数cnt肯定是n的因子,要求每段都有山峰,因此cnt肯定小于等于山峰数量。分段的宽度d=n/cnt,对山峰数量做一个前缀和,检查一下每一段的山峰数量是否没有增加即可。
1 ///暴力枚举段数 2 #include <bits/stdc++.h> 3 using namespace std; 4 #define maxn 50050 5 int high[maxn],num[maxn]; 6 7 int main(){ 8 std::ios::sync_with_stdio(0); 9 cin.tie(0); 10 int n; cin>>n; 11 for(int i=1;i<=n;++i) cin>>high[i]; 12 for(int i=2;i<=n-1;++i){ 13 num[i]=num[i-1]; 14 if(high[i]>high[i-1]&&high[i]>high[i+1]) ++num[i]; 15 } 16 int cnt=num[n]=num[n-1]; 17 18 int d; 19 bool flag; 20 int ans=0; 21 while(cnt--){ 22 if(n%(cnt+1)) continue; 23 d=n/(cnt+1); 24 flag=1; 25 for(int i=d;i<=n;i+=d){ 26 if(num[i]-num[i-d]==0){ 27 flag=0; 28 break; 29 } 30 } 31 if(flag){ 32 ans=cnt+1; 33 break; 34 } 35 } 36 cout<<ans<<endl; 37 38 return 0; 39 }