第十一届蓝桥杯c语言b真题,2020第十一届蓝桥杯国赛B组C/C++个人题解+源代码

先存个样~~之后补全

具体移至博客这个文章<<

这是我的写法,有什么建议或者更好的方法,或者错了可以告诉我。。

A:美丽的 2

思路:直接1-2020枚举判断

int main(){

int tot=0;

for(int i=1;i<=2020;i++){

int k=i;

while(k){

int g=k%10;

k/=10;

if(g==2){tot++;break;}

}

}

cout<

return 0;

}

答案:563

B:扩散

思路:bfs跑,,然后时间在2020内都记录,边记录边累计个数,每个加个2100,从0开始,一分钟向上扩散1,最多不超过2100

struct node{

int x;

int y;

int t;

};

int da[4][2]={1,0,-1,0,0,-1,0,1};

int n=2100;

int ma[10000][10000],vis[10000][10000];

queue q;

void bfs(){

mem(ma,0);

mem(vis,0);

node s,p;

p.t=0,p.x=n,p.y=n;q.push(p);

p.t=0,p.x=n+2000,p.y=n+2000;q.push(p);

p.t=0,p.x=n+2020,p.y=n+11;q.push(p);

p.t=0,p.x=n+11,p.y=n+14;q.push(p);

vis[n][n]=vis[n+2000][n+2000]=vis[n+2020][n+11]=vis[n+11][n+14]=1;

ll ans=4;

while(!q.empty()){

p=q.front();

q.pop();

for(int i=0;i<4;i++){

s.x=p.x+da[i][0];

s.y=p.y+da[i][1];

s.t=p.t+1;

if(vis[s.x][s.y]==0&&s.t<=2020){

vis[s.x][s.y]=1;

ans++;

q.push(s);

}

}

}

cout<

}

int main(){

bfs();

return 0;

}

答案:20312088

C阶层约数

答案:39001250856960000

D:本质上升序列

思路:计算每个子序列,我先转化成数字了

代码:

ull ma[250],dp[250];

int main(){

mem(dp,0);

for(int i=0;i<250;i++)dp[i]=1;

string ch;

cin>>ch;

cout<

for(int i=0;i

ma[i]=ch[i]-'a';

}

for(int i=0;i

for(int j=0;j

if(ma[i]>ma[j])dp[i]+=dp[j];

}

}

ull ans=0;

for(int i=0;i

ans+=dp[i];

}

cout<

return 0;

}

答案:2472673705(怎么感觉错了,好多人是:3616159)

题 E: 玩具蛇

思路:dfs各个找一遍,实话说,这题好像比前面简单。。

ll tot=0,n=4;

int ma[5][5];

int da[4][2]={-1,0,1,0,0,-1,0,1};

void dfs(int i,int j,int k){

if(!ma[i][j]&&k==n*n){

tot++;

return ;

}

ma[i][j]=k;

for(int e=0;e<4;e++){

int dx=i+da[e][0];

int dy=j+da[e][1];

if(dx>=1&&dy>=1&&dy<=n&&dx<=n&&!ma[dx][dy]){

dfs(dx,dy,k+1);

}

}

ma[i][j]=0;

}

int main(){

mem(ma,0);

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++){

dfs(i,j,1);

cout<

}

cout<

return 0;

}

答案:552

F: 皮亚诺曲线距离

代码:没写出来。。

G: 游园安排

思路:排个顺序,比较字母个数,小字母多的放前面,一样多的,小字母靠前放前面

(不敢保证完全对)代码:

string x[1000001];

bool cmp(const string a,const string b){

int visa[30],visb[30];

mem(visa,0);

mem(visb,0);

visa[a[0]-'A']++;

visb[b[0]-'A']++;

for(int i=1;i

visa[a[i]-'a']++;

for(int i=1;i

visb[b[i]-'a']++;

int mn=min(a.length(),b.length());

for(int i=0;i

if(visa[i]>visb[i])return 1;

else if(visa[i]

}

if(a.length()>b.length())return 0;

else if(a.length()

else{

for(int i=0;i

if(a[i]>b[i])return 0;

else if(a[i]

return 1;

}

}

int main(){

int n=-1;

string ch;

cin>>ch;

int i=0;

while(i<=ch.length()){

if(ch[i]>='A'&&ch[i]<='Z'){

n++;

x[n]+=(ch[i]);

}

else if(ch[i]!='\0') x[n]+=ch[i];

i++;

}

n++;

sort(x,x+n,cmp);

for(int i=0;i<=n/2;i++)cout<

cout<

return 0;

}

H: 答疑

思路:s+e+a小的放前面,一样的就把s+a小的放前面

(不保证完全对)代码:

struct student{

ll s,a,e;

};

student stu[1001];

bool cmp(const student n1,const student n2){

/*ll sum1=n1.a+n1.e+n1.s+n2.a+n2.s;

ll sum2=n2.a+n2.e+n2.s+n1.a+n1.s;

if(sum1==sum2)return n1.a+n1.s

return sum1

*/

ll sum1=n1.s+n1.a,sum2=n2.s+n2.a;

if(sum1+n1.e>sum2+n2.e)return 0;

else if(sum1+n1.e

else{

if(sum1>sum2)return 0;

else if(sum1

else return 1;

}

}

int main(){

int n;

cin>>n;

for(int i=0;i

cin>>stu[i].s>>stu[i].a>>stu[i].e;

}

sort(stu,stu+n,cmp);

ll ans=0,k=0;

for(int i=0;i

//cout<

k=k+stu[i].s+stu[i].a;

ans+=k;

//cout<

k+=stu[i].e;

}

cout<

return 0;

}

I: 出租车

J: 质数行者

你可能感兴趣的:(第十一届蓝桥杯c语言b真题)