51nod 1285 山峰和分段 -查找

来源:互联网 发布:c语言能够做什么 编辑:程序博客网 时间:2024/05/22 13:59

题目链接:1285

简单分析

满足A[P - 1] < A[P] > A[P + 1]的为山峰,则每段跨度至少为3,将满足情况的A[p]定义为山头,求出全部的P以及数量m。

则至多有n/m段,且每段长度能整除n。

枚举全部长度L从小到大逐个验证,查询i*L+1~(i+1)*L中是否存在山头,这里直接使用lower_bound查找大于i*L+1和(i+1)*L的第一个位置,验证是否相等,相等的话则这一段不满足,退出。

所有段都符合,则输出答案。

代码:

#include<bits/stdc++.h>using namespace std;long long all[50500];vector<int> node;vector<int> d;int main(){   int n;   cin>>n;   for(int i=1;i<=n;i++)cin>>all[i];   for(int i=2;i<n;i++)if(all[i]>all[i-1]&&all[i]>all[i+1])node.push_back(i);   if(node.size()==0){cout<<0;return 0;}   for(int i=n/node.size();i<=n;i++)if(n%i==0)d.push_back(i);   for(int i=0;i<d.size();i++){      bool flag=1;      for(int j=0;j<n/d[i];j++){         if(lower_bound(node.begin(),node.end(),j*d[i]+1)==lower_bound(node.begin(),node.end(),(j+1)*d[i])){            flag=0;break;         }      }      if(flag){         cout<<n/d[i];         return 0;      }   }}


原创粉丝点击