2019第十届蓝桥杯大赛软件类B组C/C++国赛题解

本文提供了2019年第十届蓝桥杯大赛软件类B组C/C++国赛的部分试题解析,包括平方序列、质数拆分、拼接等题目的详细做法和答案,涉及动态规划、搜索等算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

试题 A:平方序列(结果填空)

题意
在这里插入图片描述
做法:双重循环暴力找一找,把N定义成了1e4(赌不会很大)。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e4+10;
int main() {
   
	LL x = 2019*2019, y, z;
	LL rx = N, ry = N;
	for(int i = 2020; i < N; ++i) {
   
		for(int j = i+1; j < N; ++j) {
   
			y = i*i; z = j*j;
			if(z-y == y-x && i+j < rx+ry) rx = i, ry = j;
		}
	}
	cout << rx << " " << ry << " " << rx + ry << endl;
	return 0;
}

答案:7020


试题 B:质数拆分(结果填空)

题意
在这里插入图片描述

做法:有坑,我一开始以为是两个素数相加,其实可以是多个。先素数筛出2019以内的素数,然后可以转化成01背包求方案数,也可以用记忆化搜索。答案有很多种,记得开long long。

代码
1、01背包求方案数:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e4+10;
int p[N], v[N], res, tot;
LL dp[N];
int main() {
   
	for(int i = 2; i <= 2019; ++i) {
   
		if(v[i]) continue; 
		p[++tot] = i; 
		for(int j = i+i; j <= 2019; j += i) {
   
			v[j] = 1;
		}
	}
	dp[0] = 1;
	for(int i = 1; i <= tot; ++i) {
   
		for(int j = 2019; j >= p[i]; --j) 
			dp[j] += dp[j-p[i]];
	}
	cout << dp[2019] << endl;
	return 0;
}

2、记忆化搜索

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3000;
int p[N], v[N], res, tot;
LL dp[400][N];
LL dfs(int pos, int sum) {
   
	if(pos == tot + 2 || sum > 2019) return 0
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值