蓝桥杯备赛(第十届(1) )

Posted ~千里之行,始于足下~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯备赛(第十届(1) )相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
思路一:(一重循环)
2019 < x < y
x至少从2020开始,然后利用等差数列的性质,及
x2 - 2019 * 2019 = y2 - x2 推算出y2 = 2 * x2 - 2019 * 2019
然后判断y2开根号再 平方是否与y2相等,若相等,则输出。

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int t=2019*2019;
	for(int x=2020;;x++)
	{
		int x2=x*x;
		int y2=2*x2-t;
		int y=sqrt(y2);
		if(y*y==y2)
		{
			cout<<x+y<<endl;
		break;
		}
	}
	return 0;
}

思路二:(二重循环)

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

答案: 7020
在这里插入图片描述
step1 先找出2019以内的素数;
step2 用记忆化搜索求方案数。

dp[pos][sum]表示素数数组中的位置pos,目前总和为sum的方案数;
dfs(int pos, int sum)求在位置为pos,总和为sum时对应的方案数。

dp[pos][sum] =
dfs(pos+1, sum)+dfs(pos+1, sum+p[pos])
dfs(pos+1, sum)不要pos这个位置上的素数;
dfs(pos+1, sum+p[pos])要pos这个位置上的素数

变量类型用long long

#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;
	if(dp[pos][sum] != -1) return dp[pos][sum];//记忆性递归
	if(sum == 2019) return 1;
	
	LL mid = 0;
	mid += dfs(pos+1, sum);//不取
	mid += dfs(pos+1, sum+p[pos]);//取
	return dp[pos][sum] = mid;
}
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;
	}
	memset(dp, -1, sizeof dp);
	cout << dfs(1, 0);
	return 0;
}

答案: 55965365465060

以上思路和代码参考学校蓝桥杯老师辅导(讲的太好了)!

以上是关于蓝桥杯备赛(第十届(1) )的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯备赛刷题

蓝桥杯备赛|成绩统计|排列字母|纸张尺寸

蓝桥杯备赛--带你入门树状数组

蓝桥杯备赛--带你入门树状数组

蓝桥杯备赛--二分查找

蓝桥杯备赛--二分查找