当前位置:   article > 正文

2020蓝桥杯省赛C/C++B组(第一场)真题及解析

2020蓝桥杯省赛C/C++B组(第一场)真题及解析

1. 跑步训练

小明要做一个跑步训练。

初始时,小明充满体力,体力值计为 10000。如果小明跑步,每分钟损耗600 的体力。如果小明休息,每分钟增加 300 的体力。体力的损耗和增加都是均匀变化的。小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。如果某个时刻小明的体力到达 0,他就停止锻炼。请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。

答案中只填写数,不填写单位。

题解

答案:3880

本题思想简单,数据也不大,可以手算:
总体力值N = 10000;
跑一分钟、休息一分钟,一个循环消耗300体力,累计两分钟,
则:300*32 = 9600,即32次循环后,会消耗9600体力,累计32*2 = 64 分钟;
还剩余10000 - 9600 = 400,跑步一分钟消耗600体力,所以每秒消耗10体力;
64分钟后还剩400体力,所以还可以跑40秒;
小明停止时,累计64*60 + 40 = 3880
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2. 纪念日

题解

答案:52038720
日期类的问题可以用Excel表格做

3. 合并检测

新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,A 国准备给大量民众进病毒核酸检测。然而,用于检测的试剂盒紧缺。为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k - 1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k + 1 个试剂盒完成了 k 个人的检测。
A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?

题解

答案:10

假设A国有n个人,感染者有n/100

每k个人一组,共n/k组,共用n/k瓶试剂 按照最坏的情况,每多出一个感染者就多用k瓶试剂, 因此共用n/k+(n/100)*k瓶试剂

n是定值,所以求(1/k+k/100)最小

由于a+b>=2√ab 当且仅当a = b时,取等号 即1/k=k/100时,取得最小值

解得k = 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4. REPEAT程序

附件 prog.txt 中是一个用某种语言写的程序。其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。

例如如下片段:

REPEAT 2:
	A = A + 4
	REPEAT 5:
		REPEAT 6:
			A = A + 5
		A = A + 7
	A = A + 8
A = A + 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循环两次中。
REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。
A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。
请问该程序执行完毕之后,A 的值是多少?

题解

答案: 241830

思路: 可以建立一个栈来存放循环的信息,一个变量times存放当前行数被执行的次数。通过对文本的观察我们发现,可以通过每一行前面的空格数量来判断当前行数的“等级”,4个空格代表一个等级。如果当前行等级比上一层循环的等级低则说明退出了上一层循环,对栈和times进行改变即可。随后我们发现整个文本里面,所有数字都为单位数,所以我们直接用循环找到一个数字即可提取出该行的有效数字。

#include<bits/stdc++.h>
using namespace std;

int main()
{
   
	string string_;
	stack<long long> stack_; 
	freopen("prog.txt", "rb", stdin);
	getline(cin, string_);//读第一行 A=0 
	long long A=0,times=1,old_counts=0;//A=0,当前倍数,老的层数 
	while(getline(cin, string_))
	{
   
		long long counts=0;//当前的层数,
		for(counts=0; counts < string_.size(); counts++)
		{
   
			//记录空格数 4个空格是一层 
			if(string_[counts] != ' ')
				break;
		}
		counts /= 4;//这句话的层数 
		while(counts < old_counts)//新层数低 则退出一层循环 pop 
		{
   
			times /= stack_.top();
			stack_.pop();
			old_counts--; 
		} 
		if(string_[counts*4] == 'R')//R开头就是新增循环
		{
   
			for(long long now=counts*4; now < string_.size(); now++)//找到数字 
			{
   
				if(string_[now]>='0' && string_[now]<='9')//如果是数字 
				{
   
					stack_.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/518632
推荐阅读
相关标签
  

闽ICP备14008679号