问题描述
监护室每小时测量一次病人的血压,若收缩压在90 - 140之间并且舒张压在60 - 90之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正常血压的最长小时数。
输入
第一行为一个正整数n,n < 100
其后有n行,每行2个正整数,分别为一次测量的收缩压和舒张压,中间以一个空格分隔。
输出
输出仅一行,血压连续正常的最长小时数。
样例输入
4 100 80 90 50 120 60 140 90
样例输出
2
分析:
- 我们看到输出的要求是血压连续正常的最长小时数,分析样例数据,样例输出有两不连续的满足数,第一次连续时间是1,而第二次连续时间是2。程序的样例输出最终是2。
- 通过对样例输入的分析,我们得知该程序的难点在于如何增加并储存连续时间,在遇到不满足正常条件的时间段是清除正在计数的连续时间以及如何找到各段连续时间中的最大值。
思路:
为了解决连续读入,所以我们这里需要一个for循环来达到连续输入的目的
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,a,b;\\a代表收缩压,b代表舒张压
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&a,&b);
}
return 0;
}
下一个需要解决的问题是,满足条件的时候让连续时间增加。这里我们引入布尔变量T1与T2和计数器cnt。
bool T1=a>=90&&a<=140;//a满足正常收缩压的条件
bool T2=b>=60&&b<=90;//b满足正常舒张压的条件
int cnt=0;//令计数器cnt初始化为0
正常血压的条件是舒张压正常的同时并且收缩压也正常,因此我们引入逻辑运算符来表示血压是否正常,并且用if条件语句使血压正常时计数器增加。
bool T1=a>=90&&a<=140;//a满足正常收缩压的条件
bool T2=b>=60&&b<=90;//b满足正常舒张压的条件
int cnt=0;//令计数器cnt初始化为0
if(T1&&T2){
cnt++}//T1&&T2使只有收缩压和舒张压均正常时返回值为1,进入if条件语句
接下来我们需要在时间段不满足正常血压时清除计数器重新计数。由于我们运用if条件语句来判断血压是否正常,因此我们可以运用else语句来将cnt清除。
if(T1&&T2){
cnt++;}//T1&&T2使只有收缩压和舒张压均正常时返回值为1,进入if条件语句
else {
cnt=0;}
但这时我们并没有储存上一计数器内值,如果由此进行下去我们得到的是最后一次血压连续正常的时间而不是最大时间。因此我们要引入一个int变量max储存最大值,首先max=0(使最大值无限小)然后判断cnt清除时的值是否比max大,如果更大那么令max=cnt。因此我们再次引入一个if条件语句。
int max=0;
if(cnt>max){
max=cnt;}
最后当循环结束时我们输出max的值便可以得出答案。
printf("%d",max);
将上述代码段组合可以得到
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,a,b;
int max=0,cnt=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&a,&b);
bool T1=a>=90&&a<=140;
bool T2=b>=60&&b<=90;
if(T1&&T2)
{
cnt++;
if(cnt>max)
max=cnt;}
else
cnt=0;
}
printf("%d",max);
return 0;
}