题目链接:第十一届蓝桥杯省赛第二场 C++ A组
由于很难在一个网站上模拟一次考试,下面给出自己代码运行判断正误所用到的平台:
当然还会有些填空题找不到,就参照网上的答案了,题目我就直接截图拷贝了,希望不会吞
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());
}
现在我惊讶的发现我后面四题我看都不想看…好难的样子而且感觉好偏…就这样吧,复习的倒数第二天,抓紧时间!