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; }