上图是用某科学研究中采集的数据绘制成的折线图,其中红色横线表示正常数据的阈值(在此图中阈值是 25)。你的任务就是把超出阈值的非正常数据所在的区间找出来。例如上图中横轴 [3, 5] 区间中的 3 个数据点超标,横轴上点 9 (可以表示为区间 [9, 9])对应的数据点也超标。
输入格式:
输入第一行给出两个正整数 N(≤104)和 T(≤100),分别是数据点的数量和阈值。第二行给出 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
输出样例 2:
35
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解题思路:首先找到这组数据中的最大值,若最大值都小于阈值,那么就不存在超标区间,直接输出最大值即可。否则要寻找区间,首先找到区间的起始位置,然后从这个位置往后遍历直到值小于阈值,这是一个区间,然后从区间的末尾位置开始寻找下一个区间。
测试电45出错,原本我以为是末尾元素出了问题,即这组数据的最后一个元素也大于阈值,输出的时候会有问题,但我修改完成之后,还是过不了测试点45……这也太奇怪了,原来这个点没改的时候18/20,改完了一分没多……。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int n,t;
cin>>n>>t;
int number[1000000];
for(int i=0;i<n;i++)
cin>>number[i];
int k=0;
int max =-1;
for(int i=0;i<n;i++) //找最大值
{
if(max<number[i])
max = number[i];
}
if(max<t)
cout<<max;
else
{
int A,B;
while(k<n-1)
{
cout<<"[";
for(int j=k;j<n;j++)
{
if(number[j]>t)
{
A = j; //区间的起始位置
int x = A;
while(number[x]>t&&x<=n-1) //找区间的结束位置,注意末尾元素
x++;
B=x-1;
break;
}
}
k=B+1;
cout<<A<<", "<<B<<"]"<<endl;
}
}
}