十一届蓝桥杯国赛 CB组(持续更新)
Posted iuk11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十一届蓝桥杯国赛 CB组(持续更新)相关的知识,希望对你有一定的参考价值。
自己放松了几天,今天开始找状态,先从简单题入手。
试题A
答案:563
#include<bits/stdc++.h>
using namespace std;
int main(){
int res=0;
for(int i=1;i<=2020;i++){
int n=i;
while(n){
int t=n%10;
if(t==2){
res++;
break;
}
n/=10;
}
}
cout<<res<<endl;
system("pause");
return 0;
}
试题B
答案:20312088
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+100;
int dir[4][2]={
{-1,0},{1,0},{0,1},{0,-1}
};
int con[4][2]={
{0,0},{2020,11},{11,14},{2000,2000}
};
struct node{
int x,y,t;
}st,now;
long long ans;
map<pair<int,int>,int>vis;
void bfs(){
queue<node> q;
for(int i=0;i<4;i++){
vis[make_pair(con[i][0],con[i][1])]=1;
st.x=con[i][0];
st.y=con[i][1];
st.t=1;
q.push(st);
}
ans+=4;
while(!q.empty()){
st=q.front();
q.pop();
now.t=st.t+1;
if(st.t>=2021) break;
for(int i=0;i<4;i++){
now.x=st.x+dir[i][0];
now.y=st.y+dir[i][1];
if(!vis[make_pair(now.x,now.y)]){
vis[make_pair(now.x,now.y)]=1;
ans++;
q.push(now);
}
}
}
return ;
}
int main(){
bfs();
cout<<ans<<endl;
system("pause");
return 0;
}
试题C
答案:39001250856960000
小栗子:
5
!
=
2
3
+
3
1
+
5
1
5!=2^3+3^1+5^1
5!=23+31+51那么5!的因数个数为(3+1)(1+1)(1+1)
做法可以参考质数筛,先找出这个质数有多少个,然后再把它们的幂再加一相乘。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=105;
int a[maxn];
int main(){
for(int i=2;i<=100;i++){
int x=i;
for(int j=2;j*j<=i;j++){
while(x%j==0){
a[j]++;
x/=j;
}
}
if(x!=1) a[x]++;
}
ll ans=1;
for(int i=1;i<=100;i++){
if(a[i]) ans*=(a[i]+1);
}
cout<<ans<<endl;
system("pause");
return 0;
}
试题D
答案:3616159
和第二题一样,两道bfs,虽然感觉这道题用kmp,用dp都能做,但是好久没练题,已经有点不转了,等过两天有状态了补一下。
从单个字符出发,判断用idx记录的下标下的字符(即该子序列的最后一位)和它之后的字符还是否存在前小于后的关系(即子序列升序),得到这个状态之后,把每一个满足条件的子序列放到队列中,往下判断,如果满足条件就答案数加一,并把当前情况标记为访问过,以免重复。
#include<bits/stdc++.h>
using namespace std;
long long ans;
map<string,int> vis;
queue<pair<string,int> > q;
int main(){
string str;
cin>>str;
int len=str.size();
for(int i=0;i<len;i++){
string s;
s="";
s+=str[i];
if(!vis[s]){
vis[s]=1;
q.push(make_pair(s,i));
ans++;
}
}
string s;
int idx;
while(!q.empty()){
s=q.front().first;
idx=q.front().second;
q.pop();
for(int i=idx+1;i<len;i++){
if(str[idx]<str[i]&&!vis[s+str[i]]){
vis[s+str[i]]=1;
q.push(make_pair(s+str[i],i));
ans++;
}
}
}
cout<<ans<<endl;
//system("pause");
return 0;
}
试题E
答案:552
#include<bits/stdc++.h>
using namespace std;
long long ans;
int dir[4][2]={
{0,1},{1,0},{0,-1},{-1,0}
};
int vis[20][20];
void dfs(int x,int y,int step){
if(step==16){
ans++;
}
for(int i=0;i<4;i++){
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(xx<1||yy<1||xx>4||yy>4||vis[xx][yy]) continue;
vis[xx][yy]=1;
dfs(xx,yy,step+1);
vis[xx][yy]=0;
}
}
int main(){
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
vis[i][j]=1;
dfs(i,j,1);
vis[i][j]=0;
}
}
cout<<ans<<endl;
//system("pause");
return 0;
}
以上是关于十一届蓝桥杯国赛 CB组(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章
蓝桥杯国赛真题16Scratch昼夜交替 少儿编程scratch蓝桥杯国赛真题和答案讲解