首页 > 编程语言 >第十五届蓝桥杯C++B组省赛总结

第十五届蓝桥杯C++B组省赛总结

时间:2024-04-14 20:33:05浏览次数:30  
标签:cnt return gcd int cin C++ 蓝桥 heap 组省赛

A 握手问题

简单模拟,答案为:1204 5pts

B 小球反弹

数学,最重要的一点,不考虑反弹,一直让小球走,直到达到一个顶点,它就会反弹回去。
所以问题就变成了扩展这些方块,直到满足小球的角度,让小球能达到另一个顶点。
\(233333 \times 15 a= 343720 \times 17b\)
解出来 a 和 b就知道我们要延长多少块了,这里需要约分,建议使用最大公约数求一下,然后直接用勾股定理,这里用excel很好求。
答案:1100325199.77 5pts

C 好数

暴力可过,时间复杂度 \(O(7\times10^7)\) 10pts

int check(int x)
{
	int cnt = 1;
	while (x)
	{
		int p = x % 10;
		if (cnt % 2) 
		{
			if (p % 2 == 0) return false;
		}
		else 
		{
			if (p % 2 == 1) return false;
		}
		x /= 10;
		cnt++;
	}
	return true;
}

void solve()
{
	cin >> n;	
	int res = 0;
	for (int i = 1; i <= n; i++)
		if (check(i)) res++;
	cout << res;
}

D R格式

高精度+快速幂,但是没必要,5分而已 5pts

// 5分代码
long long n;
double p;
void solve()
{
	cin >> n >> p;
	double res = p * pow(2, n);
	cout << (long long)(res + 0.5);
}

E 宝石组合

好像是分解质因数,比赛时看不出来,直接暴力3循环拿30% 4.5pts
这里的公式可以化简,化简后就没有最小公倍数了,只有最大公约数。

const int N = 100010;
int a[N];
int n;

int gcd(int a, int b)
{
	return b ? gcd(b, a % b) : a;
}

int calc(int a, int b, int c)
{
	return gcd(a, c) * gcd(b, c) / gcd(a * b / gcd(a, b), c);
}

void solve()
{
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	sort(a + 1, a + 1 + n);
	
	int res = 0;
	int maxa, maxb, maxc;
	for (int i = 1; i <= n - 2; i++)
		for (int j = i + 1; j <= n - 1; j++)
			for (int k = i + 2; k <= n; k++)
			{
				if (res < calc(a[i], a[j], a[k]) && i != j && j != k && i != k)
				{
					maxa = a[i];
					maxb = a[j];
					maxc = a[k];
					res = calc(a[i], a[j], a[k]);
				}
			}
	cout << maxa << ' ' << maxb << ' ' << maxc;
}

F 数字接龙

看数据范围,一眼暴力dfs
dfs的条件很多,很多细节,比赛时写的代码在民间测试只过了60%不知道哪里错了 8pts

const int N = 15;

int g[N][N], dist[N][N];
bool st[N][N];
int n, k;

int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};

bool dfs(int x, int y, int op, int cnt)
{
	if (x == n && y == n && cnt == n * n)
	{
		return true;
	}
	
	for (int i = 0; i < 8; i++)
	{
		int a = dx[i] + x, b = dy[i] + y, c = (op + 1) % k;
		if (a < 1 || a > n || b < 1 || b > n) continue;
		if (st[a][b]) continue;
		if (g[a][b] != c) continue;
		if (a + b < x + y) continue;
		
		st[a][b] = true;
		dist[x][y] = i;
		if (dfs(a, b, c, cnt + 1)) return true;
		st[a][b] = false;
	}
	return false;
}

void solve()
{
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			cin >> g[i][j];
	
	st[1][1] = true;
	if (!dfs(1, 1, 0, 1))
	{
		cout << -1 << endl;
		return;
	}
	
	int i = 1, j = 1;
	while (!(i == n && j == n))
	{
		int p = dist[i][j];
		cout << p;
		i = i + dx[p];
		j = j + dy[p];
	}
}

G 爬山

听说是错题,我用的优先队列在民间数据上测试AC了 20pts

priority_queue<int> heap;
int n, p, q;
void solve()
{
	cin >> n >> p >> q;
	while (n--)
	{
		int x;
		cin >> x;
		heap.push(x);
	}
	while (p --)
	{
		int t = heap.top();
		heap.pop();
		t = sqrt(t);
		heap.push(t);
	}
	while (q--)
	{
		int t = heap.top();
		heap.pop();
		t /= 2;
		heap.push(t);
	}
	int res = 0;
	while (heap.size())
	{
		res += heap.top();
		heap.pop();
	}
	cout << res;
}

H 拔河

看错题了,以为是人必须选完,但是可以有人不选的 0pts

标签:cnt,return,gcd,int,cin,C++,蓝桥,heap,组省赛
From: https://www.cnblogs.com/yhgm/p/18134642

相关文章

  • 【编程】C++ 常用容器以及一些应用案例
    介绍一些我常用的C++容器和使用方法,以及使用案例。blog1概述容器(Container)是一个存储其他对象集合的持有者对象。容器以类模板实现,对支持的元素类型有很大的灵活性。容器管理元素的存储并提供多个成员函数来访问和操作元素。两个主要类别:序列容器(Sequencecontainer):将元素维......
  • 【数学】向量点乘、叉乘的理论、应用及代码实现(C++)
    前言我总结了一下向量点乘,叉乘的概念,以及他们的应用及相关C++代码的实现。blog这类问题也是技术面试经常碰到的,一次研究透了会有收获。1向量向量具有大小和方向。共线向量:两个平行的向量为共线向量。1.1叉积CrossProduct$$\vec{a}\times\vec{b}=|\vec{a}||\vec{b}|\sin......
  • C++U6-12-阶段复习测评
          7、贝尔曼福特算法,是按顺序一轮一轮的松弛,如果有可以松弛的那就再来一轮;这个题第二轮就没有可以松弛的了,所以就没有第3轮了 8、这题是dijkstra算法,算法逻辑是:Dijkstra最短路径算法的步骤如下:初始化:创建一个距离数组 dist,用于存储起点到每个节点......
  • P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    题目传送门试题A:空间【解析】本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能够算出答案。【程序】#include<bits/stdc++.h>usingnamespacestd;intmain(){printf("%d\n",256*8/32*1024*1024);return0;}【答案】67108864......
  • P8679 [蓝桥杯 2019 省 B] 填空问题 题解
    题目传送门试题A:组队【解析】本题是一道经典的DFS搜索题,每次对各号位的选手进行DFS,找到各号位上有成绩的选手时再进行进一步搜索即可。【程序】#include<bits/stdc++.h>usingnamespacestd;intteam[20][6];intmax_sum;boolvis[20];voiddfs(intu,intsu......
  • P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    题目传送门试题A:空间【解析】本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能够算出答案。【程序】#include<bits/stdc++.h>usingnamespacestd;intmain(){printf("%d\n",256*8/32*1024*1024);return0;}【答案】67108864......
  • 01_C++基础
    C++基础1.什么是c++。​c++是c语言的升级版,在c的基础上增加了很多功能。是一种高级语言。2.什么是面向对象,什么又是面向过程。​c语言就是面向过程的,c++就是面向对象的。举例:a+b​直接计算a+b就是面向过程。​面向对象就是给a+b穿上了一层衣服。不......
  • c++ inline
    当在头文件中定义函数时,如果这个头文件被多个.cpp文件包含,那么每个包含该头文件的.cpp文件都会有一个该函数的副本。这在链接阶段会引起“多重定义”的错误,因为链接器找到多个相同符号的定义。使用inline关键字可以解决这个问题。当一个函数被声明为inline,编译器会尝试将......
  • 第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组题解
    试题A:握手问题本题总分:\(5\)分思路:组合计数,用为\(50\)个人握手的总方案数\(C^{2}_{50}\),减去七个人彼此没有握手握手的方案数\(C^{2}_{7}\)即为答案。A:握手问题#include<bits/stdc++.h>#defineintlonglong#definedblongdouble#defineall(f)f.begin()......
  • C与C++在函数和数据的比较
    C与C++在函数和数据的比较CData(struct)数据是一个类型->根据数据的类型创建出真正的数据Function函数就是用来处理数据的缺陷:语言没提供关键字.所以数据是全局的->各个函数都可以处理数据C++Data将数据和处理这些数据的函数包裹在一起,其他函数看不到其他函数处理......