第十一届蓝桥杯省赛第二场 C++ A组

题目链接:第十一届蓝桥杯省赛第二场 C++ A组

由于很难在一个网站上模拟一次考试,下面给出自己代码运行判断正误所用到的平台:

  1. 蓝桥杯·寒假百校真题大联赛(研究生/大学A组)(第4期)
  2. 蓝桥杯练习系统

当然还会有些填空题找不到,就参照网上的答案了,题目我就直接截图拷贝了,希望不会吞


1.门派制作
2.既约分数
3.蛇形填数
4.七段码
5.平面分割
6.成绩分析

A.门牌制作

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int res = 0;
	for (int i = 1; i <= 2020; i++)
	{
		int t = i;
		while (t)
		{
			if (t % 10 == 2)
				res++;
			t /= 10;
		}
	}
	cout << res;

}

B.既约分数

在这里插入图片描述
吐槽一下,蓝桥杯是真的喜欢最大公因数

#include<bits/stdc++.h>
using namespace std;
int p[2022][2022];
int gcd(int a, int b)
{
	if (b == 0)
		return a;
	return
		gcd(b, a % b);
}
int main()
{
	int cnt = 0;
	for(int i=1;i<=2020;i++)
		for(int j=1;j<=2020;j++)
			if (gcd(i, j) == 1)
				cnt++;
	cout << cnt;
}

C.蛇形填数

在这里插入图片描述

这题挺简单的,基本上能目测出来吧,就是注意了。20行20列是在1行39列开始,这要注意…不是从40那开始,第一次做就在这翻车了

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  cout<<761;
  return 0;
}

D.七段码

在这里插入图片描述
寻思了下,也就2的7次方个状态,可以直接暴力!暴力的做法是枚举所有状态,然后判断是否是通路,判断通路的方法这里我用bfs
要命的是,最开始的main函数中写成了dfs(0,0),程序也能正常跑,但结果是160我还美滋滋的以为我对了,提交判定才知道我错了…与正确答案80差了整好一倍,简直乌鱼子,要是后天蓝桥杯也这样那我完蛋了,bug de了我好久,最后输出state才发现怎么会有奇数!才发现要初始的dfs错了…应该是dfs(1,0),有点对自己感到绝望…

#include<bits/stdc++.h>
using namespace std;
vector<int>v[8];
void init()
{
	v[1].push_back(2);
	v[1].push_back(6);
	v[2].push_back(1);
	v[2].push_back(3);
	v[2].push_back(7);
	v[3].push_back(2);
	v[3].push_back(4);
	v[3].push_back(7);
	v[4].push_back(3);
	v[4].push_back(5);
	v[5].push_back(4);
	v[5].push_back(6);
	v[5].push_back(7);
	v[6].push_back(1);
	v[6].push_back(5);
	v[6].push_back(7);
	v[7].push_back(2);
	v[7].push_back(3);
	v[7].push_back(5);
	v[7].push_back(6);
}
int judge(int state)
{
	int vis[8] = { 0 };
	vector<int>v1;
	for (int i = 1; i <= 7; i++)
		if (state & (1 << i))
			v1.push_back(i);
	if (v1.size() == 0)
		return 0;
	queue<int>q;
	int cnt = 1;
	q.push(v1[0]);
	vis[v1[0]] = 1;
	while (!q.empty())
	{
		int i = q.front();
		q.pop();
		for (int j = 0; j < v[i].size(); j++)
			for (int k = 0; k < v1.size(); k++)
				if ((v[i][j] == v1[k]) && !vis[v1[k]])
				{
					q.push(v1[k]);
					cnt++;
					vis[v1[k]] = 1;
				}
	}
	if (cnt == v1.size())
		return 1;
	return 0;
}
int dfs(int s,int state)
{
	if (s == 8)
		return judge(state);
	return dfs(s + 1, state) + dfs(s + 1, state | (1 << s));
}
int main()
{
	init();
	cout << dfs(1, 0);
}

E.平面分割

在这里插入图片描述
这题我其实是用数学的方法做的,没用代码
我们先考虑直线分割平面,再考虑圆圈分割平面,找出通式,两者一叠加,在考虑直线与圆相交部分所多产生的平面
n条直线产生的区域与n-1条直线之间产生的区域的关系:
an=an-1+n
故n条直线所产生的区域:an=(n+2)(n-1)/2 + 2
n个圆产生的区域与n-1个圆之间产生的区域的关系:
bn=bn-1+2*(n-1)
n个圆产生的区域: bn=n2-n+2
再考虑叠加,直线和圆每有一个交点就多一个区域,那么因为叠加而新增的区域为:20 X 2 X 20(含义:20个圆,每一条直线能与每个圆多2个交点,就是多2个区域,有20条直线)
由于我们按着叠加算,所以必须减去个初始的2,因为本来就在一个平面内算的,这玩意算了2次,可以拿1条直线与1个圆的情况想想看,这样就很好理解了。
故对于n条直线m个圆的通式为:
(n+2)(n-1)/2 + 2+m2-m+2 + mX2Xn - 2

至于严谨的数学分析我目前的水平是做不到的感觉…都是我的直觉…而且误打误撞也做对了哈哈

#include <iostream>
using namespace std;
int main()
{
  cout<<1391;
  return 0;
}

F.成绩分析

在这里插入图片描述
在这里插入图片描述
唯一有价值的便是又复习了遍输出固定位数小数了吧,printf(“%.2f”, s / v.size());

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin >> n;
	vector<int>v;
	double s = 0;
	for (int i = 0; i < n; i++)
	{
		int t;
		cin >> t;
		v.push_back(t);
		s += t;
	}
	sort(v.begin(), v.end());
	cout << v[v.size() - 1]<<endl;
	cout << v[0] << endl;
	printf("%.2f", s / v.size());
}

现在我惊讶的发现我后面四题我看都不想看…好难的样子而且感觉好偏…就这样吧,复习的倒数第二天,抓紧时间!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值