2023年第十四届蓝桥杯省赛C++ 大学生A组

 基本没有算法基础,第一次参加蓝桥杯,简单复盘一下。

目录

试题 A 幸运数

分析

枚举 O(K)

试题 B 有奖问答

分析

DFS 

试题 C 平方差

分析

枚举O(n^3)

因数分解 O(n*sqrt(n)) 

 奇偶判断 O(n) 

试题D 更小的数

分析 

动态规划DP O(n^2)  

试题E 颜色平衡树

分析

试题 F 买瓜

分析

试题 I 网络稳定性

分析

并查集+dijkstra算法


试题 A 幸运数

2023年第十四届蓝桥杯省赛C++ 大学生A组_第1张图片

分析:

1~10e8,不用考虑奇数位跳过的问题,直接枚举。

枚举 O(K)

#include
using namespace std;
int ans = 0;
int main()
{
	int a[9];
	for (int i = 10; i < 100000000; i++) {
		int temp = i;
		int index = 0;
		while (temp) {
			index++;
			a[index] = temp % 10;
			temp /= 10;
		}
		//奇数数位直接跳过
		if (index & 1) continue;
		int sum1 = 0, sum2 = 0;
		for (int i = 1; i <= index / 2; i++) {
			sum1 += a[i];
			sum2 += a[index - i + 1];
		}
		if (sum1 == sum2) ans++;
	}
	cout << ans << endl;
	return 0;
}

答案:4430091

试题 B 有奖问答

2023年第十四届蓝桥杯省赛C++ 大学生A组_第2张图片

分析:

第一反应肯定是dfs,2^30的规模,直接暴搜。

DFS 

#include
using namespace std;
int ans = 0;
void dfs(int k,int r)
{
	if (r == 70) ans++;
	if (k == 30 || r == 100) return;
	dfs(k + 1, r + 10);
	dfs(k + 1, 0);
}
int main()
{
	dfs(0,0);
	cout << ans << endl;
	return 0;
}

答案:8335366

试题 C 平方差

2023年第十四届蓝桥杯省赛C++ 大学生A组_第3张图片

分析:

第一反应 x=y^2-z^2 可以转换成 x= (y+z)(y-z),毫无疑问,奇数一定可以写作平方差的形式。那就只需要考虑偶数的情况,想半天没想好边界,最后还是选择了枚举,即对x,枚举 a 存在 b^2 == x+ a^2。

枚举O(n^3)

#include
#include
#define ll long long 
using namespace std;
ll l, r;
ll ans = 0;
int main()
{
	cin >> l >> r;
	for (ll i = l; i <= r; i++) {
		//奇数
		if (i & 1) ans++;
		//偶数
		else {
			bool flag = false;
			for (ll j = 0; j <= i; j++) {
				for (ll k = j + 1; k <= i; k++) {
					if (pow(k, 2) == pow(j, 2) + i) {
						flag = true;
						break;
					}
				}
				if (flag) {
					ans++;
					break;
				}
			}
		}
	}
	cout << ans << endl;
	return 0;
}

因数分解 O(n*sqrt(n)) 

同理有  x=y^2-z^2 ->  x=(y+z)(y-z)

令 

a=(y+z)  

b=(y-z)

a>b;

x=a*b;

y=(a+b)/2;

z=(a-b)/2;

(这里是用到了初中知识吗,但有点三角函数的感觉,还想了半天,确实让我卡在这里了,汗)

#include
#include
#define ll long long 
using namespace std;
ll l, r;
ll ans = 0;
int main()
{
	cin >> l >> r;
	for (ll i = l; i <= r; i++) {
		//奇数
		if (i & 1) ans++;
		//偶数
		else {
			int flag = false;
			//因数分解
			for (ll j = 2; j <= sqrt(i); j++) {
				if (i%j == 0) {
					ll a = j;
					ll b = i / j;
					ll temp = a + b;
					if (!(temp & 1)) flag = true;
				}

你可能感兴趣的:(蓝桥杯,c++,职场和发展)