20230807 比赛总结
第一题
题目
题目描述
近期,多地推出常态化核酸检测政策,要求市民每隔一段时间都要完成一次核酸检测,反复循环。如果没有,在进入相关场所时,扫场所码会有弹窗提醒,将无法乘坐公共交通工具、无法进入公共场所。
为了响应国家号召,为防疫做贡献,每隔几天排队做一次核酸已经成为市民小王的日常。但并不是每次去他都能顺利检测,因为有时排队人很多,有时又因为有急事要离开,所以每个人因各种原因都有自己的排队忍耐度,假如小王的排队忍耐度为5,说明他最多允许自己前面排5个人,否则他就会离开。
假如你是核酸检测人员,已知现在有n人排队,和n个人的排队忍耐度,按照他们的排队顺序请你计算出今天会检测几个人。
输入格式
从文件 line.in 中读入数据。
第一行输入一个整数n(n<=1000)。
第二行输入n个人的排队忍耐度,数据之间用单个空格隔开(忍耐度<=1000)。
输出格式
输出到文件 line.out 中。
输出一个整数表示你今天检测的人数。
样例输入
10 5 2 2 2 2 3 100 4 6 200样例输出
7
思路
因为题目要求按顺序, 所以就从前向后遍历一次, 判断第i个人前面是否有\(\le input[i]\)个人.
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("line.in","r",stdin);
freopen("line.out","w",stdout);
int n;
cin>>n;
int cnt=0;
int input;
for(int i=0;i<n;i++){
cin>>input;
if(cnt<=input){
cnt+=1;
}
}
cout<<cnt;
return 0;
}
第二题
题目
Time Limit:
1000ms
Memory Limit:
32768kB
题目描述
如上图所示,每个位置都有一个建筑,每个位置占据的宽度都是一样,可能有不同的高度,现在需要挑选一个位置的上方开始人工降雨,问你最多能淋到雨的位置有几个。如果一个位置能被雨淋到,而且紧挨着的旁边的建筑不高于他,那么旁边的建筑也能被雨淋到,上图中在中间的地方降雨总共有4个位置会被淋到。输入格式
第一行输入一个整数n
第二行输入n个数,表示n个建筑的高度。输出格式
输出一个整数样例
Input 15 1 2 1 2 1Output 1
3Input 2
8 1 2 1 1 1 3 3 4Output 2
6Input 3
10 522 575 426 445 772 81 447 629 497 202Output 3
5数据范围
\(1 \le n \le 1000\),建筑的高度都\(\le 1000\)
思路
分别计算每个建筑左边最长的值和右边最长的值, 两个的和再\(+1\) (因为建筑本身也算).
如何计算一个建筑左边or右边最长可灌溉的长度?
以左边为例, 从最左开始遍历, 第一个建筑长度为0 (因为它的左边没有建筑) , 后面的建筑每个判断, 如果比左边的一个建筑高, 那么它可以灌溉到左边的那个建筑, 那么左边的那个建筑能灌溉到的这个建筑也能, 所以是左边那个建筑的长度\(+1\); 如果它比左边那个建筑矮, 那么它所有左边的建筑都无法灌溉, 记为0.
代码
#include<bits/stdc++.h>
using namespace std;
int high[1005];
int leftLength[1005];
int rightLength[1005];
int aMax=-1e9;
int main(){
freopen("rain.in","r",stdin);
freopen("rain.out","w",stdout);
int n;
cin>>n;
cin>>high[1];
for(int i=2;i<=n;i++){
cin>>high[i];
if(high[i]>=high[i-1]){
leftLength[i]=leftLength[i-1]+1;
}
}
for(int i=n-1;i>=1;i--){
if(high[i]>=high[i+1]){
rightLength[i]=rightLength[i+1]+1;
}
aMax=max(aMax,leftLength[i]+rightLength[i]+1);
}
aMax=max(aMax,leftLength[n]+rightLength[n]+1);
cout<<aMax;
return 0;
}

浙公网安备 33010602011771号