PAT(乙级)2020年春季考试 7-2 超标区间 (20分)
7-2 超标区间 (20分)
上图是用某科学研究中采集的数据绘制成的折线图,其中红色横线表示正常数据的阈值(在此图中阈值是 25)。你的任务就是把超出阈值的非正常数据所在的区间找出来。例如上图中横轴 [3, 5] 区间中的 3 个数据点超标,横轴上点 9 (可以表示为区间 [9, 9])对应的数据点也超标。
输入格式:
输入第一行给出两个正整数 N(≤)和 T(≤),分别是数据点的数量和阈值。第二行给出 N 个数据点的纵坐标,均为不超过 1000 的正整数,对应的横坐标为整数 0 到 N−1。
输出格式:
按从左到右的顺序输出超标数据的区间,每个区间占一行,格式为 [A, B]
,其中 A
和 B
为区间的左右端点。如果没有数据超标,则在一行中输出所有数据的最大值。
输入样例 1:
11 25
21 15 25 28 35 27 20 24 18 32 23
输出样例 1:
[3, 5]
[9, 9]
输入样例 2:
11 40
21 15 25 28 35 27 20 24 18 32 23
代码讲解:此题完全可以用一个标志变量来区别区域断没断,因为都是正整数
我用了-1做判断。。。
1 #include<stdio.h> 2 int main() 3 { 4 int i,n,lim,data,max=0,a=-1,count=0; 5 scanf("%d %d",&n,&lim); 6 for(i=0;i<n;i++) 7 { 8 scanf("%d",&data); 9 if(data>lim) 10 { 11 if(-1==a) 12 { 13 a=i,count++; 14 printf("[%d,",a); 15 } 16 a=i; 17 } 18 else 19 { 20 if(a!=-1) 21 { 22 printf(" %d]\n",a); 23 } 24 a=-1; 25 } 26 max=max>data?max:data; 27 } 28 if(a!=-1) //由于最后可能都是大于阀值得,最后一个区间很可能没有输出,所以需要判断 29 printf(" %d]\n",a); 30 if(0==count) 31 printf("%d\n",max); 32 return 0; 33 }
我们发现这道题它区间是一个,还是俩个输出的方法是一样的
比如区间[3, 5]和只有一个[9, 9]是一样的,如果我们改一下,
区间只有一个的,只输出一个数。。。。就不能使用单一
变量了。。。起始都要记录,最后判断是否相等。。。。
改题的代码:
1 #include<stdio.h> 2 int main() 3 { 4 int i,n,lim,data,max=0,a=-1,b=-1,count=0; 5 scanf("%d %d",&n,&lim); 6 for(i=0;i<n;i++) 7 { 8 scanf("%d",&data); 9 if(data>lim) 10 { 11 if(-1==a) 12 { 13 a=i,count++,b=i; 14 } 15 else 16 { 17 b=i; 18 } 19 } 20 else 21 { 22 if(a!=-1) 23 { 24 if(a!=b) 25 printf("[%d, %d]\n",a,b); 26 else 27 printf("[%d]\n",a); 28 a=-1; 29 } 30 31 } 32 max=max>data?max:data; 33 } 34 if(a!=-1) 35 { 36 if(a!=b) 37 printf("[%d, %d]\n",a,b); 38 else 39 printf("[%d]\n",a); 40 } 41 42 if(0==count) 43 printf("%d\n",max); 44 return 0; 45 }