0%

蓝桥杯PREV07-连号区间数

题目链接

题目概述

定义连号区间为:某个区间按序排列后,其元素为“连续”的。求一个全排列中连号区间的数目。

题目分析

迭代 l 和 r ,找出区间 [l, r] 的最大值和最小值,判断区间和与“从最小值到最大值的连续数之和”是否相当。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
using namespace std;
int nums[50005];
int n, ans;

int main(){
scanf("%d", &n);
for(int i=1; i<=n; i++)
scanf("%d", &nums[i]);

for(int j=1; j<=n; j++){
int M=INT_MIN, m=INT_MAX;
int sum=0;
for(int i=j; i<=n; i++){
sum+=nums[i];
M=max(M, nums[i]);
m=min(m, nums[i]);
if(sum==(m+M)*(M-m+1)/2.0){
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}

自我总结

比较简单,要注意 sum==(m+M)*(M-m+1)/2.0 是2.0。