【蓝桥杯B组】第16届蓝桥杯省赛C/C++B组
文章目录
试题A:移动距离
1、题目分析

分析:根据题目易知,小明只能沿x轴向右移动或以原点(0,0)为圆心以当前位置与原点距离为半径的圆周移动,记沿x轴移动的路径为Xi,沿圆周移动的路径为Li,即移动的总路程是p个Xi与q个Li。
Xi=x1+x2+……+xp
Li=l1+l2+i……+lq
ans=Xi+Li
当出现以下情况时,移动的距离最少:
小明先沿x轴移动r个距离,然后沿圆周移动到(233,666)
alpha=arctan(666/233)
r=sqrt(233233+666666),x1=r,l=alpha*r
ans=x1+l
2、代码
#include <iostream>
#include <cmath>
//也可以直接包头文件<bits/stdc++.h>
using namespace std;
//先走r,再沿半径为r的圆周移动l
int main()
{
//r
double r = sqrt(666 * 666+233 * 233);
//l=alpha*r
double alpha = atan2(666, 233);
double l = alpha * r;
double ans = r + l;
//cout << ans<<endl;//1576.45
cout << round(ans);//1576,四舍五入
return 0;
}
答案:1576
试题B:客流量上限
1、题目分析

分析:
①当i==j时
Ai*Ai <= i * i+2025
即 Ai<=sqrt(i * i+2025)
(根据以下代码找规律:)
for (int i = 1; i <= 2025; i++)
cout << 'A' << i << "<=" << (int)sqrt(i * i + 2025) << endl;

由上图可知,从A1013开始每一项都有Ai<=i
当1<=i<=1013时,均有Ai<=1013,即前1013项将1~1013分配完毕
当1014<=i<=2025时,均有Ai<=i,即可得每一项固定Ai=i(例:1013<A1014<=1014,所以A1014=1014,而每一项不重复,则1014<A1015<=1015,所以A1015=1015,以此类推……)
此时,只用分析1<=i<=1013中的序列分配方案
注:该题的以下思路没有听明白(哭),可以去看原版讲解视频(b站:ACking),自行理解
当1<=i<=1012,1013<=j<=2025时
Ai * Aj=Ai * j<=i * j+2025 即Ai<=floor(i+2025/j),Ai<=i+1
故,当1<=i<=1012时,Ai<=i+1
当1013<=i<=2025时,Ai=i
当1<=i<=1012时
A1<=2 : A1=1/2
A2<=3: A2=1/3,2/3
A1~A1012中每项都有两种情况
故,共有2^1012种可能
2、代码
#include <iostream>
#include <cmath>
using namespace std;
//1<=i<=1012 ,Ai<1013; 1013<=i<=2025, Ai<=i
// Ai=i(1014<=i<=2025)
int main()
{
/*for (int i = 1; i <= 2025; i++)
cout << 'A' << i << "<=" << (int)sqrt(i * i + 2025) << endl;*/
int ans2 = 1;
int m = 1e9 + 7;
for (int i = 1; i <= 1012; i++)
{
ans2 *= 2;
ans2 %= m;
}
cout << ans2;
return 0;
}
答案:
试题C:可分解的正整数
1、题目分析


分析:先暴力破解查看规律,之后根据规律写代码。
设首项为a1,项数为n(n>=3),已知首项和项数可求出序列之和。
#include <iostream>
using namespace std;
bool check(int x)
{
//暴力
//测试所有的首项a1(-x,x) 和 项数n[3,2*x+1]
int sum = 0;
for (int a1 = -x; a1 <= x; a1++)
{
for (int n = 3; n <= 2*x+1; n++)
{
//sum = n * a1 + n * (n - 1) / 2;
sum = (a1 + a1 + n - 1) * n / 2;
if (sum == x)
return true;
}
}
return false;
}
int main()
{
//将输入的数据个数
int N;
cin >> N;
int ans = 0;
for (int i = 0; i < N; i++)
{
int x;
cin >> x;
if (check(x))
{
cout << x << ' ';
ans++;
}
}
cout << ans << endl;
return 0;
}

如上图,可知0~100中,只有0和1不符合。事实上,除了0/1,其它正整数均可分解。
2、代码
#include <iostream>
using namespace std;
int main()
{
//找规律,除了0/1,其余均可以找到(题目已知Ai !=0)
int N; cin >> N;
int ans = 0;
for (int i = 0; i < N; i++)
{
int x; cin >> x;
if (x != 1)
ans++;
}
cout << ans << endl;
return 0;
}
试题D:产值调整
1、题目分析


分析:仍然是先暴力破解,找规律,之后进行优化。
#include <iostream>
using namespace std;
int main()
{
int T; cin >> T;
while (T--)
{
int a, b, c, k; cin >> a >> b >> c >> k;
while (k--)
{
int ta = (b + c) / 2;
int tb = (a + c) / 2;
int tc = (a + b) / 2;
a = ta, b = tb, c = tc;
}
cout << a << ' ' << b << ' ' << c << endl;
}
return 0;
}

如上图,当a=b=c时,会重复,循环可以提前退出
2、代码
#include <iostream>
using namespace std;
int main()
{
int T; cin >> T;
while (T--)
{
int a, b, c, k; cin >> a >> b >> c >> k;
while (k--)
{
int ta = (b + c) / 2;
int tb = (a + c) / 2;
int tc = (a + b) / 2;
a = ta, b = tb, c = tc;
//优化
if (a == b && b == c)
break;
}
cout << a << ' ' << b << ' ' << c << endl;
}
return 0;
}
试题E:画展布置
1、题目分析


分析:首先看到,L式子中含有绝对值符号,对Bi进行升序排序,去掉绝对值符号。
化简:
2、代码
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int a[N];
signed main()
{
int n, m; cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
//升序,去L绝对值符号
sort(a + 1, a + n + 1);
int ans = LLONG_MAX;
//选m副画
for (int i = m; i <= n; i++)
{
ans = min(ans, a[i] * a[i] - a[i - m + 1] * a[i - m + 1]);
}
cout << ans << endl;
return 0;
}

试题F:水质检测
1、题目分析


分析:看了洛谷上的题解,有贪心解法和动态规划解法的(我还没学到),把题解放在这,大家可以查看:水质检测题解
2、代码
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)