第十届蓝桥杯国赛C++B组简要题解

A A A题:

int a=2019*2019;
	for(int i=2020;;i++){
		int x=2*i*i-a;
		int y=sqrt(x);
		if(y*y==x&&i<y){
			cout<<i+y<<endl;break;
		}
	}

B B B题:

背包问题可用记忆化搜索或者 d p dp dp解决。

记忆化搜索:

int p[N],cnt;
bool vis[N];
void ss(){
	for(int i=2;i<=2019;i++){
		if(!vis[i]) p[cnt++]=i;
		for(int j=0;j<cnt&&i*p[j]<=2019;j++){
			vis[i*p[j]]=1;
			if(i%p[j]==0) break;
		}
	}
}
ll dp[N][N];
ll dfs(int pos,int s){
	if(~dp[pos][s]) return dp[pos][s];
	if(s==2019) return 1;	//注意这一句要在下面的if一句前面 不然如果pos=cnt+1&&s==2019  就返回0了 
	if(pos>=cnt||s>2019) return 0; 
	ll ans=0;
	ans+=dfs(pos+1,s);
	ans+=dfs(pos+1,s+p[pos]);
	return dp[pos][s]=ans; 
}
int main(){
	ss();
	mst(dp,-1);
	printf("%lld\n",dfs(0,0));
	return 0;
}

d p dp dp

int p[N],cnt;
bool vis[N];
void ss(){
	for(int i=2;i<=2019;i++){
		if(!vis[i]) p[cnt++]=i;
		for(int j=0;j<cnt&&i*p[j]<=2019;j++){
			vis[i*p[j]]=1;
			if(i%p[j]==0) break;
		}
	}
}
ll dp[N];
int main(){
	ss();
	dp[0]=1;
	for(int i=0;i<cnt;i++){
		for(int j=2019;j>=p[i];j--){
			dp[j]+=dp[j-p[i]];
		}
	}
	printf("%lld\n",dp[2019]);
}

待更 … … \dots\dots