AcWing 1210. 连号区间数

原题链接

考察:枚举

错误思路:

        三层for循环暴力.

做多了区间dp...枚举区间只能想到按长度枚举区间,但这道题不能这么枚举.....

正确思路:

        按区间端点来枚举区间,连号区间的特点是最大值-最小值 = 右端点-左端点.随着区间向右边延长,而动态记录最值.

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 const int N = 10010;
 5 int a[N];
 6 int main()
 7 {
 8     int n,ans = 0;
 9     scanf("%d",&n);
10     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
11     for(int i=1;i<=n;i++)
12     {
13         int maxn = 0,minv = N;
14         for(int j=i;j<=n;j++)
15         {
16             maxn = max(maxn,a[j]);
17             minv = min(minv,a[j]);
18             if(maxn-minv==j-i) ans++;
19         }
20     }
21     printf("%d\n",ans);
22     return 0;
23 }

 

posted @ 2021-02-24 19:08  acmloser  阅读(55)  评论(0编辑  收藏  举报