蓝桥杯备赛(第十届(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) )的主要内容,如果未能解决你的问题,请参考以下文章