2019蓝桥国赛
A 签到题
#include<bits stdc++.h>
using namespace std;
#define ll long long
int main(){
for(int i=2020;;++i){
for(int j=i+1;;++j){
if(i*i-2019*2019==j*j-i*i){
cout << i + j ;
return 0;
}
else if(i*i-2019*2019<=j*j-i*i) break;
}
}
return 0;
} B 背包是一定体积内的最大价值(不需装满),装箱是刚好等于箱子体积的方案数(要装满)
#include<bits stdc++.h>
using namespace std;
#define ll long long
int const N=3e3+7;
int cnt;
int p[N],vis[N];
ll f[N];
int main(){
for(int i=2;i<=2019;++i){
if(vis[i]==0){
for(int j=i+i;j<=2019;j+=i){
vis[j]=1;
}
p[++cnt]=i;
}
}
f[0]=1;
for(int i=1;i<=cnt;++i){
for(int j=2019;j>=p[i];--j){
f[j]+=f[j-p[i]]; //加上前一步的方案数
}
}
cout << f[2019];
return 0;
} C
以对角线为起点,以左右边界为终点切割
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int vis[17][17],ans;
int xx[]={0,1,0,-1};
int yy[]={1,0,-1,0};
void dfs(int x,int y){
if(x==0||y==7){
ans++;
return ;
}
for(int i=0;i<4;++i){
int dx=x+xx[i];
int dy=y+yy[i];
if(dx<=7&&dx>=0&&dy<=7&&dy>=0&&!vis[dx][dy]&&dx!=dy){
vis[dx][dy]=vis[dy][dx]=1;
dfs(dx,dy);
vis[dx][dy]=vis[dy][dx]=0;
}
}
}
int main(){
for(int i=0;i<=7;++i){
memset(vis,0,sizeof vis);
vis[i][i]=1;
dfs(i,i);
}
cout << ans;
return 0;
}
D 签到题
暴力就好
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll ans;
int pan(int x){
ll cnt=0;
for(int i=1;i<=x;++i){
if(x%i==0) cnt++;
}
if(cnt==100) {
ans=x;return 1;
}
return 0;
}
int main(){
for(int i=100;;++i){
if(pan(i)) break;
}
cout << ans ;
return 0;
}
查看5道真题和解析
