老题新解|正常血压
《信息学奥赛一本通》第150题:正常血压
题目描述
监护室每小时测量一次病人的血压,若收缩压在 90∼14090\sim 14090∼140 之间并且舒张压在 60∼9060\sim 9060∼90 之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正常血压的最长小时数。
输入格式
第一行为一个正整数 n(n<100)n(n<100)n(n<100),其后有 nnn 行,每行 222 个正整数,分别为一次测量的收缩压和舒张压。
输出格式
输出仅一行,血压连续正常的最长小时数。
输入输出样例 #1
输入 #1
4
100 80
90 50
120 60
140 90
输出 #1
2
大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 150 题:正常血压。
一、题目描述
洛谷的题号是:B2151 正常血压
二、题意分析
这道题是信息学奥赛一本通练习题的第 150 题。
根据输入格式的描述,输入第一行为一个正整数 n,n 小于 100,其后有 n 行,每行有两个正整数,分别是测量的收缩压和舒张压,此处需要使用 for 循环实现,从 1 遍历到 n,分别输入两个值。
int n;
cin>>n;
for(int i=1;i<=n;i++)
{}
根据题目要求,需要计算病人保持正常血压的最长小时数,所以需要使用 int 类型来记录这两个血压的数据。
int a,b;
for(int i=1;i<=n;i++)
{cin>>a>>b;
}
因为要记录最长连续的血压,所以需要新建一个变量来存储这个连续的数据,初始值为 0。
int cnt=0;
正常血压值,收缩压在:90140,舒张压在:6090,并且包括端点值,所以对 a 和 b 进行判断。
if(a>=90&&a<=140&&b>=60&&b<=90)//血压正常
{}
血压正常则进行累加,即进行 ++
处理。
if(a>=90&&a<=140&&b>=60&&b<=90)//血压正常
{cnt++;
}
其他情况则是不正常,将 cnt 置为 0。
else
{cnt=0;
}
但由于要求最长连续时间,所以需要定义一个最长小时数的标准,也就是最大值,如果大于最大值的时候,更新最长小时数。
int maxx=-1;
在分支语句中进行比较,如果大于最大值,则更新最大值。
if(cnt>maxx)
{maxx=cnt;
}
最终输出最大值即可。
cout<<maxx;
按照样例输入对数据进行验证。
只输出了 1,分析一下代码,发现是在最后的时候,并没有做比较,所以我们还需要在最后一次比较。
举个例子:
3
100 80
120 70
130 80
每次都正常:
- 第 1 次:cnt = 1
- 第 2 次:cnt = 2
- 第 3 次:cnt = 3
循环结束,cnt=3
,但因为最后没触发 else
,maxx
还是初始值 0,结果错误。
所以如果最后一条或最后几条数据是正常的,循环会一直执行 cnt++,但循环结束后没有再进入 else,于是 maxx 没有机会更新。
所以我们需要在循环结束后,再比较一次。
if (cnt>maxx)
{maxx=cnt;
}
再测试一下即可。
符合样例输出,到网站提交测评。
测试通过!
三、完整代码
该题的完整代码如下:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{int n;int a,b;cin>>n; int cnt=0;int maxx=-1;for(int i=1;i<=n;i++){cin>>a>>b;if(a>=90&&a<=140&&b>=60&&b<=90)//血压正常{cnt++;}else{if(cnt>maxx){maxx=cnt;}cnt=0;}}if (cnt>maxx){maxx=cnt;}cout<<maxx;return 0;
}
四、总结
本题考察了循环控制与区间判断,主要涵盖以下知识点:
1、区间判断
判断一个值是否落在某个区间 [L, R]
,用 x>=L && x<=R
。
本题中收缩压范围 [90, 140]
,舒张压范围 [60, 90]
。
2、连续统计
需要维护一个临时计数器 cnt
表示当前连续正常的小时数。
需要维护一个最大值 maxx
,在 cnt
更新时判断是否刷新最大值。
3、循环结束后的处理
如果最后一次输入仍然是正常血压,循环结束后 maxx
可能没有被更新,因此需要在循环结束后再判断一次。
常见易错点与解题建议:
1、忘记最后一次比较
容易只在异常时更新 maxx
,导致当末尾都是正常血压时结果错误。
👉 建议:循环结束后补一次 if(cnt>maxx) maxx=cnt;
。
2、初始值设置错误
有些同学把 maxx 初始化为 0,但如果所有血压都异常,会导致输出错误结果。
👉 建议:初始化为 -1 或者直接用 0,但要确保逻辑覆盖“全不正常”的情况。
3、区间边界遗漏
容易把端点值写成 <
而不是 <=
,导致 90
和 140
等边界数据被判为不正常。
👉 建议:仔细阅读题目“包含端点值”,写成 >=
和 <=
。
4、输入处理不完整
有些同学可能写成 while(cin>>a>>b)
,但题目格式明确有 n,容易导致逻辑混乱。
👉 建议:严格按照题目格式,先读 n
,再循环 n
次。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~
我们下集见~