第十一届蓝桥杯B组C/C++省赛第一场(仅供个人复习)

所有的代码没有提交测试过,结果是对的但可能由于复杂度等其他原因不能通过,仅提供思路!

试题 A: 跑步训练(3880)

【问题描述】
小明要做一个跑步训练。
初始时,小明充满体力,体力值计为 10000。如果小明跑步,每分钟损耗600 的体力。如果小明休息,每分钟增加 300 的体力。体力的损耗和增加都是均匀变化的。小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。如果某个时刻小明的体力到达 0,他就停止锻炼。
请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。
答案中只填写数,不填写单位。
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

(1)代码

#include<iostream>
using namespace std;
int main()
{
	int k=10000;
	int t=1;
	while(k!=0)
	{
		if(t%2!=0)
		{
		k-=600;	
		t++;
		}
		else
		{
		k+=300;
		t++;	
		}
	}
	cout<<t*60;
	return 0;
}

试题 B: 纪念日(52038720)

【问题描述】
2020 年 7 月 1 日是中国...成立 99 周年纪念日。中国...成立于 1921 年 7 月 23 日。请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包含多少分钟?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

(1)excle(因为都是12时,所以不需要考虑是否有多出来的分钟数,只需要算整天数即可)

C2和D2单元格设为日期格式

E2=D2-C2;(此时算出来的是天数)

F2=E2*24*60;

 (1)代码

#include<iostream>
using namespace std;
int M[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
	int y=1921,m=7,d=23;
	int count=0;
	while(y!=2020||m!=7||d!=1)
	{
		if(y%400==0||(y%4==0&&y%100!=0))
		{
			M[2]=29;
		}
		else
		{
			M[2]=28;
		}
		d++;
		count++;//天数加多少次中间就经过了多少天 
		if(d>M[m])
		{
			d=1;
			m++;
		}
		if(m>12)
		{
			m=1;
			y++;
		}
	}
	cout<<count*24*60;
	return 0;
}

试题 C: 合并检测(10)

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

(1)代码

#include<iostream>
using namespace std;
int main()
{
	int sum=0,ans,k;
	int n=1000;
	int min=9999;
	for(int k=1;k<100;k++)
	{
		if(n%k==0)//如果没有余数
		sum=n/k+0.01*n*k; 
		else
		sum=n/k+0.01*n*k+1;//有余数额外再加一个试剂盒;
		if(sum<min)
		{
			min=sum;
			ans=k;
		}	
	}
	cout<<ans; 
}

试题 D: 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
该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循环两次中。REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。请问该程序执行完毕之后,A 的值是多少?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

(1)代码:不会!

试题 E: 矩阵

【问题描述】
把 1 ∼ 2020 放在 2 × 1010 的矩阵里。要求同一行中右边的比左边大,同一列中下边的比上边的大。一共有多少种方案?答案很大,你只需要给出方案数除以 2020 的余数即可。
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

考点:动态规划dp

(1)代码

这个题要依靠动态规划,即前一个时间段的状态影响后一个时间段的走向。

①如果上边个数等于下边,那么将要放置的数必须放置在第一行最右边,这个可以手动画图模拟一下

②如果上边个数大于下边,那么将要放置的数可以放在第一行的最右边也可以放置在第二行的最右边,也就是说可以放在两个位置,手动画图模拟一下可以得出这个结论,已经很明显了,动态规划就是用在后一阶段的决策取决于前一阶段时(运筹学学的,理解意思,但是用在代码里还是不太熟熟练)。

敲代码较少第一次碰见动态规划题目,反正我是懵了!!!

#include<iostream>
using namespace std;
int dp[1020][1020];
int main()
{
    for(int i=1;i<=1010;i++)
	{
		dp[i][0]=1;//第一行随便放,第二行不放是一种方案 
	}
	for(int i=1;i<=1010;i++)
	{
		for(int j=1;j<=1010&&j<=i;j++)//这里j<=i是因为如果按照题目要求来放置第二行的个数不会大于第一行的 
		{
			if(i==j)
			dp[i][j]=dp[i][j-1];
			else
			dp[i][j]=(dp[i][j-1]+dp[i-1][j]);
			dp[i][j]%=2020;
		}
	}
	cout<<dp[1010][1010];
	return 0;
}

试题 F: 整除序列

【问题描述】
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,请输出这个序列中值为正数的项。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。
【样例输入】
 20
【样例输出】
 20 10 5 2 1
【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ n ≤ 109。
对于所有评测用例,1 ≤ n ≤ 1018。

(1)代码(感觉这样写挺对的!!!)

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n!=0)
	{
	cout<<n<<" ";
	n/=2;
	}
        return 0
}

试题 G: 解码

时间限制: 1.0s  内存限制: 256.0MB  本题总分:20 分
【问题描述】
小明有一串很长的英文字母,可能包含大写和小写。在这串字母中,有很多连续的是重复的。小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母 + 出现次数的形式。例如,连续的 $5 个 a,即 aaaaa,小明可以简写成 a5(也可能简写成 a4a、aa3a 等)。对于这个例子:HHHellllloo,小明可以简写成 H3el5o2。为了方便表达,小明会将连续的不超过 9 个相同的字符写成简写的形式。现在给出简写后的字符串,请帮助小明还原成原来的串。
【输入格式】
输入一行包含一个字符串。
【输出格式】
输出一个字符串,表示还原后的串。

【样例输入】

  H3el5o2
【样例输出】

  HHHellllloo
【评测用例规模与约定】
对于所有评测用例,字符串由大小写英文字母和数字组成,长度不大于100。
请注意原来的串长度可能超过100。

考点:将字符转换为数值即“字符-48”

(1)代码

#include<iostream>
using namespace std;
int main()
{
	string s;
	cin>>s;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]>='a'&&s[i]<='z')//为字符直接输出
		{
			cout<<s[i];
		}
		else
		for(int j=1;j<s[i]-48;j++)//字符‘s[i]’转换为数字s[i]
		{
		cout<<s[i-1];
		}	
	}
	return 0;
}

试题 H: 走方格

时间限制: 1.0s  内存限制: 256.0MB  本题总分:20 分
【问题描述】
在平面上有一些二维的点阵。这些点的编号就像二维数组的编号一样,从上到下依次为第 1至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。注意,如果行号和列数都是偶数,不能走入这一格中。问有多少种方案。
【输入格式】
输入一行包含两个整数 n, m。
【输出格式】
输出一个整数,表示答案。
【评测用例规模与约定】
对于所有评测用例,1≤n≤30,1≤m≤30。

数据范围
1≤n,m≤30
输入样例1:
3 4
输出样例1:
2
输入样例2:
6 6
输出样例2:
0

考点:动态规划

(1)代码

#include<iostream>
using namespace std;
#define N 32
int dp[N+1][N+1];
int main()
{
	int m,n;
	cin>>m>>n;
	dp[1][1]=1;
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=N;j++)
		{
			if(i==1&&j==1)
			continue;
			if(i%2!=0||j%2!=0)
			dp[i][j]=dp[i-1][j]+dp[i][j-1];
		}
	}
	cout<<dp[m][n];
	return 0;
}

试题 I: 整数拼接

时间限制: 1.0s  内存限制: 256.0MB  本题总分:25 分
【问题描述】
给定一个长度为 n的数组 A1,A2,⋅⋅⋅,An。你可以从中选出两个数 Ai 和 Aj ( i 不等于 j ),然后将 Ai 和 Aj 一前一后拼成一个新的整数。例如 12 和 345 可以拼成 12345 或 34512。注意交换 Ai 和 Aj 的顺序总是被视为 2 种拼法,即便是 Ai=Aj 时。请你计算有多少种拼法满足拼出的整数是 K 的倍数。
【输入格式】
第一行包含 2 个整数 n 和 K。
第二行包含 n 个整数 A1,A2,⋅⋅⋅,An。
【输出格式】
一个整数代表答案。

样例输入:
4 2
1 2 3 4

样例输出:
6

【评测用例规模与约定】
对于 30% 的评测用例,1≤n≤1000,1≤K≤20,1≤Ai≤104。
对于所有评测用例,1≤n≤105,1≤K≤105,1≤Ai≤109。

不会!附上大佬写的代码链接。

不能复制他人链接了吗?附上别人的代码链接官方说我违规!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值