P8644 [蓝桥杯 2016 国 B] 机器人塔
题目描述
X 星球的机器人表演拉拉队有两种服装,A 和 B。
他们这次表演的是搭机器人塔。
类似:
A B B A B A A A B B B B B A B A B A B B A队内的组塔规则是:
A 只能站在 AA 或 BB 的肩上。
B 只能站在 AB 或 BA 的肩上。
你的任务是帮助拉拉队计算一下,在给定 A 与 B 的人数时,可以组成多少种花样的塔。
输入格式
输入一行两个整数MMM和NNN,空格分开(0<M,N<N+M≤2310<M,N<N+M\leq2310<M,N<N+M≤231,保证存在k∈Nk\in \mathbb{N}k∈N,N+M=k(k−1)2N+M=\frac{k(k-1)}{2}N+M=2k(k−1)),分别表示 A、B 的人数。
输出格式
要求输出一个整数,表示可以产生的花样种数。
输入输出样例 #1
输入 #1
1 2输出 #1
3输入输出样例 #2
输入 #2
3 3输出 #2
4说明/提示
时限 1 秒, 256M。蓝桥杯 2016 年第七届
C++实现
#include<bits/stdc++.h>usingnamespacestd;constintN=100;intx,y,s,cnt=0;boolok[N],op[N];boolcheck(intx,inty){intn=s;for(inti=1;i<=n;++i)op[i]=ok[i];while(--n){for(inti=1;i<=n;++i){if(op[i]==op[i+1]){op[i]=false;--x;}else{op[i]=true;--y;}if(x<0||y<0)returnfalse;}}returntrue;}voiddfs(intt,intsum,intans){if(sum<0||ans<0)return;if(t==s+1){if(check(sum,ans))++cnt;return;}dfs(t+1,sum-1,ans);ok[t]=true;dfs(t+1,sum,ans-1);ok[t]=false;}intmain(){scanf("%d%d",&x,&y);s=x+y;for(inti=1;i<=50;++i){if(s==i*(i+1)/2){s=i;break;}}dfs(1,x,y);printf("%d",cnt);return0;}后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容