# [语言月赛 202311] 风球
## 题目背景
与中国大陆不同,当台风即将来袭时,香港天文台将会根据情况发布 $1,3,8,9,10$ 五个等级的热带气旋警告信号。数字越大,代表台风影响越严重。当发布 $8$ 号烈风信号时,香港就会停课停工。下图为香港天文台的 $10$ 号飓风信号:
## 题目描述
香港天文台选定了 $8$ 个气象站。在台风影响期间,香港天文台会根据这些气象站的风速观测数据决定发布哪一个等级的预警。
- 因为已经受到台风影响,因此必然会发布 $1$ 号戒备信号;
- 若有 $4$ 个气象站的持续风力达到或超过 $41$ 千米/小时,则发布 $3$ 号强风信号;
- 若有 $4$ 个气象站的持续风力达到或超过 $63$ 千米/小时,则发布 $8$ 号烈风信号;
- 若有 $1$ 个气象站的持续风力达到或超过 $118$ 千米/小时,则发布 $10$ 号飓风信号;
- 多个条件同时满足,则发布其中最高等级的信号。
现在给定这些气象站的风力数据,请计算出香港天文台应当发布什么警告信号。
这道题要求读入
8 个气象观测站的风力监测数据。这是一项重复劳动,因此适合使用循环结构进行完成。
接下来的关键在于,如何根据这些条件,简单地去判断应当发布什么警告信号。这里给出一种做法。定义如下变量:
cnt41 表示,风力大于等于 41
41 千米/小时的气象站个数;
cnt63 表示,风力大于等于 63
63 千米/小时的气象站个数;
cnt118 表示,风力大于等于 118
118 千米/小时的气象站个数;
我们在循环读入的时候,每读入一个风力检测数据,更新上面提到的三个变量的值,如:
for (int i=1;i<=8;i++) {
int x;cin >> x;//读入风力数据
if (x>=41) cnt41++;//更新风力大于等于 41 千米/小时的气象站的个数
if (x>=63) cnt63++;//更新风力大于等于 63 千米/小时的气象站的个数
if (x>=118) cnt118++;//更新风力大于等于 118 千米/小时的气象站的个数
}
接下来我们可以根据这三个变量得到对应的结果分别进行判断:
- 有 11 个气象站的持续风力达到或超过 118118 千米/小时,即
cnt118>=1
时,为 1010 号飓风信号; - 有 44 个气象站的持续风力达到或超过 6363 千米/小时,即
cnt63>=4
时,为 88 号烈风信号; - 有 44 个气象站的持续风力达到或超过 4141 千米/小时,即
cnt41>=4
时,为 33 号强风信号; - 其他情况则是 11 号戒备信号;
需要注意,由于多个条件可能是同时满足的,例如可能同时出现 11 个气象站持续风力达到或超过 118118 千米/小时,而且其他气象站均观测到了超过 6363 千米/小时的风力的情况。这个时候需要输出符合要求的信号中,等级最高者。因此,需要使用 if-else
的分支结构,从最高等级的信号往较低等级的信号进行判断。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t,c=0,c1=0,c4=0;
for(int i=0;i<8;i++)
{
cin>>t;
if(t>=118) c++;
if(t>=63) c1++;
if(t>=41) c4++;
}
if(c>=1)
cout<<10;
else
if(c1>=4)
cout<<8;
else
if(c4>=4)
cout<<3;
else
cout<<1;
return 0;
}