第十一届蓝桥杯省赛真题C++B组

试题A:跑步训练

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

#include<iostream>
using namespace std;
int main()
{
	int n = 10000;
	int s = 10, t = 5;
	double res = 0;
	while (n>0) {
		n -= 600;
		res++;
		if (n > 0)
		{
			n += 300;
			res++;
		}
		else {
			res--;
			n += 600;
			break;
		}
	}
	res =res*60 + (double)n / s;
	cout << (int)res << endl;
	system("pause");
	return 0;
}

试题B:纪念日

【问题描述】
2020年7月1日是中国共产党成立99周年纪念日。中国共产党成立于1921年7月23日。
请问从1921年7月23日中午12时到2020年7月1日中午 12时一共包含多少分钟?
答案:52038720

方法一:
利用excel表格计算相差天数,进而求得题目中所求答案

在这里插入图片描述

方法二:

 - 公历闰年判定遵循的规律为:四年一闰,百年不闰,四百年再闰。

#include<iostream>
using namespace std;
struct Date {
	int y;
	int m;
	int d;
};
int isLeap(int y)
{
	return y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
}
int daysOfMonth(Date d)
{
	int days[12] = { 31,0,31,30,31,30,31,31,30,31,30,31 };
	if (d.m != 2)
		return days[d.m - 1];
	else
		return 28 + isLeap(d.y);
}
int daysOfDate(Date d)
{
	int days = 0;
	for (int y = 1; y <= d.y; y++)
		days += 365 + isLeap(y);
	for (int m = 1; m < d.m; m++)
		days += daysOfMonth(d);
	days += d.d;
	return days;
}
int main()
{
	Date d1, d2;
	cout << "Input 2 days days(yyyy mm dd):" << endl;
	cin >> d1.y >> d1.m >> d1.d;
	cout << d1.y << "-" << d1.m << "-" << d1.d << endl;
	int days1 = daysOfDate(d1);
	cout << "days1=" << days1 << endl;
	cin >> d2.y >> d2.m >> d2.d;
	cout << d2.y << "-" << d2.m << "-" << d2.d << endl;
	int days2 = daysOfDate(d2);
	cout << "days2=" << days2 << endl;
	cout << "days distance is " << fabs(days1 - days2) << endl;
	system("pause");
	return 0;
}

所以结果为:36138×24×60=52038720

试题C:合并检测

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

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int n = 100;//假设总共有100人
	int sum = 0,min=INT_MAX,res;
	for (int k = 1; k <= n; k++)
	{
		if (100 % k == 0)
			sum = 100 / k + k;
		else
			sum = 100 / k + 1 + k;
		if (sum < min)
		{
			min = sum;
			res = k;
		}
	}
	cout << res << endl;
	system("pause");
	return 0;
}

试题D:PEPEAT程序

在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{	
	int A = 0;
	for (int i = 0; i < 2; i++)
	{
		A += 4;
		for (int j = 0; j < 5; j++)
		{
			for (int k = 0; k < 6; k++)
				A += 5;
			A += 7;
		}
		A += 8;
	}
	A += 9;
	cout << "A:" << A << endl;
	system("pause");
	return 0;
}
(算出来结果为403,有问题,请各位小伙伴指出)

试题F:整除序列

在这里插入图片描述

#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
	ll n;
	cin >> n;
	while (n > 0)
	{
		cout << n << " ";
		n /= 2;
	}
	cout << endl;
	system("pause");
	return 0;
}

试题G:解码

在这里插入图片描述

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

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str;
	//getline(cin, str);
	cin >> str;
	int n = str.length();
	string newstr;
	for (int i = 0; i < n-1; i++)
	{
		char ch = str[i + 1];
		if (ch-'0' > 0&&ch-'0' < 10)
		{
			for (int j = 0; j < ch - '0'; j++)
				newstr += str[i];
			i++;
		}
		else
			newstr += str[i];
	}
	cout << newstr << endl;
	system("pause");
	return 0;

}

试题H:走方格

在这里插入图片描述
在这里插入图片描述

典型的动态规划问题:
#include<iostream>
using namespace std;
const int N = 35;
int dp[N][N];
int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		dp[i][1] = 1;
	for (int i = 1; i <= m; i++)
		dp[1][i] = 1;
	for (int i = 2; i <= n; i++)
		for (int j = 2; j <= m; j++)
			if (i % 2 == 0 && j % 2 == 0)
				dp[i][j] = 0;
			else
				dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
	cout << dp[n][m] << endl;
	system("pause");
	return 0;
}

试题I:整数拼接

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<string>
using namespace std;
const int N = 100010;
int a[N];
int connect(int x,int y)
{
	int t = y;
	while (t)
	{
		x *= 10;
		t /= 10;
	}
	x += y;
	return x;
}
int main()
{
	int n, k;
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	int res = 0;
	for (int i = 1; i <= n; i++)
	{
		for (int j = i+1; j <= n; j++)
		{
			int s = a[i], t = a[j];
			if (connect(s, t) % k == 0)
				res++;
			if (connect(t, s) % k == 0)
				res++;
		}
	}
	cout << res << endl;
	system("pause");
	return 0;
}

试题J:网络分析

在这里插入图片描述
在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 10010;
int p[N], d[N];
int find(int x)
{
	if (p[x] == x || p[p[x]] == p[x])
		return p[x];
	int r = find(p[x]);
	d[x] += d[p[x]];
	p[x] = r;
	return r;
}
int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		p[i] = i;
	while (m--)
	{
		int t, a, b;
		cin >> t >> a >> b;
		if (t == 1)
		{
			a = find(a), b = find(b);
			if (a != b)
			{
				d[a] -= d[b];
				p[a] = b;
			}
		}
		else {
			a = find(a);
			d[a] += b;
		}
	}
	for (int i = 1; i <= n; i++)
		if (i == find(i))
			cout << d[i] << " ";
		else
			cout << d[i] + d[find(i)] << " ";
	cout << endl;
	system("pause");
	return 0;
}

欢迎各位小伙伴提出看法建议

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值