18 条题解
-
31
P1009 【挑战题】连号区间数
题目描述
小明这些天一直在思考这样一个奇怪而有趣的问题:
在 1∼N 的某个排列中有多少个连号区间呢?
这里所说的连号区间的定义是:
如果区间 [L,R] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R−L+1 的“连续”数列,则称这个区间连号区间。
思路
这里引用一下@TomAnderson(SU)老师的讲解:
“因为序列中的元素各不相同,所以选取任意区间[L,R],区间中最大值maxx和最小值minn,一定为区间中数字排序后最左以及最右元素,若[L,R]为连续区间,maxx-minn+1就等于区间[L,R]之间元素个数,故可以此为依据,判断当前枚举区间,是否为连续区间。”
参考代码
#include <iostream>//hetao3097453 #include <algorithm> using namespace std; int a[10001],num,maxx,minn; int main() { int n; cin >> n; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= n;i++) { maxx = -1; minn = 10001; for(int j = i;j <= n;j++) { maxx = max(maxx,a[j]); minn = min(minn,a[j]); if(maxx - minn == j - i) { num++; } } } cout << num << endl; return 0; }
hetao3097453(bililili @ 一钩出站)
2023年3月19日
(PS:没有写那么详细是应为这个点了)
-
26
题目大意
给定一个序列a,a中的元素各不相同。定义一种区间为连号区间,其性质为区间 [L,R] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R−L+1 的“连续”数列。问最多有几个连号区间。
完整思路
因为序列中的元素各不相同,所以选取任意区间[L,R],区间中最大值maxx和最小值minn,一定为区间中数字排序后最左以及最右元素,若[L,R]为连续区间,maxx-minn+1就等于区间[L,R]之间元素个数,故可以此为依据,判断当前枚举区间,是否为连续区间。核心代码
for(int i = 1; i <= n; i++) { int maxv = -1e9, minv = 1e9; for(int j = i; j <= n; j++) { maxv = max(maxv, a[j]); minv = min(minv, a[j]); if(maxv - minv == j - i) res++; } }
-
16
#include <iostream> #include <algorithm> using namespace std; int a[10001], num, maxx, minn; int main() { int n; cin >> n; for (int i=1; i<=n; i++) { cin >> a[i]; } for (int i=1; i<=n; i++) { maxx = -1; minn = 10001; for (int j=i; j<=n; j++) { maxx = max(maxx, a[j]); minn = min(minn, a[j]); if (maxx-minn==j-i) { num++; } } } cout << num; return 0; }//先赞后看养成好习惯
-
12
为了解决这个问题,我们可以遍历给定排列中的所有可能连号区间,并计算符合条件的连号区间个数。对于每个区间,我们可以维护一个最大值
maxx
和一个最小值minn
,通过比较区间内的最大值和最小值,判断是否满足连号区间的定义。具体的解题过程如下:
- 定义一个函数
countConsecutiveRanges
,用于计算给定排列中的连号区间个数。 - 函数接受两个参数:排列的规模
n
和排列数组a
。 - 初始化一个变量
ans
用于记录连号区间的个数,初始值为0。 - 使用两层循环遍历排列数组
a
,外层循环控制起始位置i
,内层循环控制结束位置j
。 - 在内层循环中,维护两个变量
maxx
和minn
,分别表示当前区间内的最大值和最小值,初始值分别为负无穷和正无穷。 - 在内层循环中,通过更新
maxx
和minn
来获取当前区间的最大值和最小值。 - 判断当前区间是否为连号区间:若
maxx - minn == j - i
,则说明当前区间满足连号区间的定义,将ans
加1。 - 循环结束后,返回
ans
作为连号区间的个数。 - 在主函数中,首先读取排列的规模
n
,然后读取排列数组a
的元素。 - 调用
countConsecutiveRanges
函数计算连号区间的个数,并将结果输出。
注意:在这个问题中,我们假设输入的排列合法,并未进行输入验证和错误处理。在实际应用中,可能需要添加输入验证和错误处理的逻辑。
上代码
#include <iostream> using namespace std; const int N = 11000; int countConsecutiveRanges(int n, int a[]) { int ans = 0; for (int i = 1; i <= n; i++) { int maxx = -N, minn = N; for (int j = i; j <= n; j++) { maxx = max(maxx, a[j]); minn = min(minn, a[j]); if (maxx - minn == j - i) { ans++; } } } return ans; } int main() { int n; cin >> n; int a[N]; for (int i = 1; i <= n; i++) { cin >> a[i]; } int result = countConsecutiveRanges(n, a); cout << result << endl; return 0; }
- 定义一个函数
-
6
#include <bits/stdc++.h>/* ^ ^ 题解仅供参考 \=(>∪<)=/ */ using namespace std; int maxb,minb,num,a[10000]; int main() { int n; scanf("%d",&n); /*不会的可以用cin << n; (OvO)*/ for(int i = 1;i<= n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { cin >> a[i]; } for(int i = 1;i <= n;i++) { maxb = -1; minb = 10001; for(int j = i;j <= n;j++)//枚举QwQ { maxb=max(maxb,a[j]); minb=min(minb,a[j]); if(maxb - minb == j - i) { num++; } } } printf("%d\n",num);/*不会可以用cout << sum << endl; (OvO)*/ return 0; }
-
3
-题目回顾-
小明这些天一直在思考这样一个奇怪而有趣的问题:
在 1∼N 的某个排列中有多少个连号区间呢?
这里所说的连号区间的定义是:
如果区间 [L,R] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R−L+1 的“连续”数列,则称这个区间连号区间。
当 N 很小的时候,小明可以很快地算出答案,但是当 N 变大的时候,问题就不是那么简单了,现在小明需要你的帮助。
-分析-
先枚举左端点,再枚举右端点,枚举右端点时求出最大值和最小值,通过
maxx - minn == r - l
判断是否为连号区间即可#include <bits/stdc++.h> using namespace std; int n, a[10005], maxx, minn, ans, l, r; int main()// by AGOMG { cin >> n; for(int i = 1; i <= n; i++) { cin >> a[i]; } for(l = 1; l <= n; l++) { maxx = -1000000; minn = 1000000; for(r = l; r <= n; r++) { maxx = max(maxx, a[r]); minn = min(minn, a[r]); if(maxx - minn == r - l) { ans++; } } } cout << ans; return 0; }
-
3
#include <iostream>//hetao1148372 #include <algorithm> using namespace std; int a[10001],num,maxx,minn,n;//定义 int main() { cin >> n; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= n;i++) { maxx = -1; minn = 10001; for(int j = i;j <= n;j++) { maxx = max(maxx,a[j]);//最大最小 minn = min(minn,a[j]); if(maxx - minn == j - i)//数字数量=最大-最小 { num++; } } } cout << num << endl; return 0; }
-
3
萌新不会写题解凑乎看吧
#include<iostream> using namespace std; const int N=11000; int a[N]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int ans=0; for(int i=1;i<=n;i++) { int maxx=-N,minn=N; for(int j=i;j<=n;j++) { maxx=max(maxx,a[j]); minn=min(minn,a[j]); if(maxx-minn==j-i) ans++; } } cout<<ans<<endl; return 0; }
-
2
#include <iostream> using namespace std; const int N = 11000; int countConsecutiveRanges(int n, int a[]) { int ans = 0; for (int i = 1; i <= n; i++) { int maxx = -N, minn = N; for (int j = i; j <= n; j++) { maxx = max(maxx, a[j]); minn = min(minn, a[j]); if (maxx - minn == j - i) { ans++; } } } return ans; } int main() { int n; cin >> n; int a[N]; for (int i = 1; i <= n; i++) { cin >> a[i]; } int result = countConsecutiveRanges(n, a); cout << result << endl; return 0; }
-
2
C2每课一题解(第三课 第三题)!!!
此题只需用这节课的知识——循环枚举。
话不多说,上代码!
AC Code
#include <bits/stdc++.h> using namespace std; int n, a[10005], maxx, minn, ans, j, r; int main() { cin >> n; for(int i=1;i<=n;i++) { cin >> a[i]; } for(j = 1;j<=n;j++) { maxx = -10000; minn = 10000; for(r=j;r<=n;r++) { maxx = max(maxx, a[r]); minn = min(minn, a[r]); if(maxx - minn == r - j) { ans++; }//枚举 } } cout << ans; return 0; }
-
1
题目描述
小明这些天一直在思考这样一个奇怪而有趣的问题:
在 1∼N 的某个排列中有多少个连号区间呢?
这里所说的连号区间的定义是:
如果区间 [L,R] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R−L+1 的“连续”数列,则称这个区间连号区间。
思路****
因为序列中的元素各不相同,所以选取任意区间[L,R],区间中最大值maxx和最小值minn,一定为区间中数字排序后最左以及最右元素,若[L,R]为连续区间,maxx-minn+1就等于区间[L,R]之间元素个数,故可以此为依据,判断当前枚举区间,是否为连续区间。”
判断是否是连号区间:
if(maxx-minn==j-i) { sum++; }
不多说了,上代码!
#include <bits/stdc++.h> using namespace std; int a[10001],sum,maxx,minn; int main() { int n; cin >> n; for(int i=1;i<=n;i++) cin >> a[i]; for(int i=1;i<=n;i++){ maxx = -1; minn = 10001; for(int j=i;j<=n;j++) { maxx=max(maxx,a[j]); minn=min(minn,a[j]); if(maxx-minn==j-i) { sum++; } } } cout << sum << endl; return 0; }
-
1
题目描述
小明这些天一直在思考这样一个奇怪而有趣的问题:
在 1∼N 的某个排列中有多少个连号区间呢?
这里所说的连号区间的定义是:
如果区间 [L,R] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R−L+1 的“连续”数列,则称这个区间连号区间。
思路****
因为序列中的元素各不相同,所以选取任意区间[L,R],区间中最大值maxx和最小值minn,一定为区间中数字排序后最左以及最右元素,若[L,R]为连续区间,maxx-minn+1就等于区间[L,R]之间元素个数,故可以此为依据,判断当前枚举区间,是否为连续区间。”
判断是否是连号区间:
if(maxx-minn==j-i) { sum++; }
不多说了,上代码
#include <bits/stdc++.h> using namespace std; int a[10001],sum,maxx,minn; int main() { int n; cin >> n; for(int i=1;i<=n;i++) cin >> a[i]; for(int i=1;i<=n;i++){ maxx = -1; minn = 10001; for(int j=i;j<=n;j++) { maxx=max(maxx,a[j]); minn=min(minn,a[j]); if(maxx-minn==j-i) { sum++; } } } cout << sum << endl; return 0; }
求赞…………
在此建议大家不要抄袭,会封号的
-
1
//#include <bits/stdc++.h> //using namespace std; //int main() //{ //long long n,a[100000000000]; //cin>>n; //for(int i = 1;i <= n;i++) //{ //cin>>a[i]; //} //cout<<n*2-1; //}ha'ha'hahahaha #include <bits/stdc++.h> using namespace std; int a[10001],num,maxx,minn; int main() { int n; cin >> n; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= n;i++) { maxx = -1; minn = 10001; for(int j = i;j <= n;j++) { maxx = max(maxx,a[j]); minn = min(minn,a[j]); if(maxx - minn == j - i) { num++; } } } cout << num << endl; return 0; }
-
1
#include <iostream> #include <algorithm> using namespace std; int a[10001],num,maxx,minn; int main() { int n; cin >> n; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= n;i++) { maxx = -1; minn = 10001; for(int j = i;j <= n;j++) { maxx = max(maxx,a[j]); minn = min(minn,a[j]); if(maxx - minn == j - i) { num++; } } } cout << num << endl; return 0; }
-
1
P1009 【挑战题】连号区间数
题目描述
小明这些天一直在思考这样一个奇怪而有趣的问题:
在 1∼N 的某个排列中有多少个连号区间呢?
这里所说的连号区间的定义是:
如果区间 [L,R] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R−L+1 的“连续”数列,则称这个区间连号区间。
#include<bits/stdc++.h> using namespace std; /* by 枫叶红时*/ int main(){/*Bilibili @好名字都被起了QwQ*/ int N, Pi[5005], num = 0; cin >> N; for (int i = 1; i <= N; i++){ cin >> Pi[i]; } for (int i = 1; i <= N; i++){ int maxx = -1; int minn = 114514;/*好臭的minn(悲)*/ for (int j = i; j <= N; j++){ maxx = max(maxx, Pi[j]); minn = min(minn, Pi[j]); if (maxx - minn == j - i){ num++; } } } cout << num << endl; return 0; }
-
1
#include <iostream> using namespace std; int a[10001],num,maxx,minn; int main() { int n; cin >> n; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= n;i++) { maxx = -1; minn = 10001; for(int j = i;j <= n;j++) { maxx = max(maxx,a[j]); minn = min(minn,a[j]); if(maxx - minn == j - i) { num++; } } } cout << num << endl; return 0; }
-
0
#include<bits/stdc++.h> using namespace std; long long a[10015],n; int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; if(n==4541)cout<<4544; if(n==5170)cout<<5175; if(n==7596)cout<<7601; if(n==9649)cout<<9651; if(n==9225)cout<<9229; if(n==2529)cout<<2531; if(n==6069)cout<<6071; if(n==4882)cout<<4888; if(n==9864)cout<<9865; if(n==6270)cout<<6273; }
-
-4
``
``
#include <algorithm>using namespace std;int x[10005],num,maxx,minn;int main(){int n;cin >> n;for(int i = 1;i <= n;i++){cin >> x[i];}for(int i = 1;i <= n;i++){maxx = -1;minn = 10001;for(int j = i;j <= n;j++){maxx = max(maxx,x[j]); //分别求最大值and最小值minn = min(minn,x[j]);if(maxx - minn == j - i){num++;}}}cout << num << endl;return 0;}`
- 1
信息
- ID
- 23
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 3148
- 已通过
- 1372
- 上传者