第十一届蓝桥杯国赛CC++b组总结填空题Word文档下载推荐.docx
《第十一届蓝桥杯国赛CC++b组总结填空题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第十一届蓝桥杯国赛CC++b组总结填空题Word文档下载推荐.docx(11页珍藏版)》请在冰点文库上搜索。
把周围的四个格子变为黑色,标记分钟,直到2020停止答案:
20312088
#iiiclude<
iostream>
#include<
cstring>
string>
vector>
cmath>
algorithm>
stack>
queue>
iomanip>
#defiiieN100000
#defiiieINF0x3f3f3f3f
#defnie11longlong
#defiiieIsonrt«
lJ.niid
#defiiiersonrt«
1|l,mid+1,r
usingnamespacestd;
boola[8000][8000];
intcnt=2020;
intdir[4][2]={0,1,0,-1,1,0,-1,0);
stnictnode{
mtx,y,step;
};
queue<
node>
qu;
voidbfs()
{
a[0+3000][0+3000]=l;
a[2020+3000][11+3000]=1;
a[ll+3000][14+3000]=l;
a[2000+3000][2000+3000]=l;
qu.push(node{0+3000,0+3000,0});
qu.push(node{2020+3000J1+3000,0});
qu.push(node{11+3000,14+3000,0});
qu.push(node{2000+3000,2000+3000,0});
while(qu.sizeO)
(
nodetemp=qu.frontO;
qu.pop();
if(temp.step==cnt)
continue;
for(iiiti=0;
i<
4;
i++)
intxx=temp.x+dir[i][0];
mtyy=temp.y+dir[i][1];
if(!
a[xx][yy])
a[xx][yy]=l;
qu.push(node{xx,yy.temp.step+l});
)
intmain()
ios:
:
syiic_with_stdio(false);
cin.tie(O);
cout.tie(O);
inti,j;
mtsiim=0;
bfs();
fbr(i=0;
8000;
fbr(j=0;
j<
j++)
sum+=a[i][j];
cout«
sum«
endl:
return0;
试题c:
阶乘约数
10分
定义阶乘n!
=lX2X3X・•・Xn。
请问100!
(100的阶乘)有多少个约数。
其实就是把从那些因子中挑出来问你最多能组成多少个数。
为了防止23二6的重复计算,我们不能直接挑,所以要先用唯一分解定理分解成素因子乘积的形式
如:
5!
=12345=2331*51;
所以现在的情况变成了:
2有4种选择(0、1、2、3个),3有2种选择(0、1个),5有2种选择(0、1个).即每个素因子的选择个数是其幕次+1。
所以对于100!
的答案就是把2T00的每一个数进行分解,记录下
每一个素因子的个数,然后+1乘起来即可
39001250856960000
inta[101];
longlongsum=l;
memset(a509sizeof(a));
for(inti=2;
=100:
inttemp=i;
fbr(intj=2;
=temp;
while(temp%j=0)
temp=temp/j;
a[j]++;
fbr(inti=2;
if(a[i]!
=O)
sum=sum*(a[i]+1);
coiit«
endl;
试题D:
本质上升序列
io分
【问题描述】小蓝特别喜欢单调递增的事物。
在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。
例如,在字符串lanqiao中,如果取出字符n和q,则nq组成一个单调递增子序列。
类似的单调递增子序列还有Inq、i、ano等等。
小蓝发现,有些子序列虽然位置不同,但是字符序列是一样的,例如取第二个字符和最后一个字符可以取到ao,取最后两个字符也可以取到ao。
小蓝认为他们并没有本质不同。
对于一个字符串,小蓝想知道,本质不同的递增子序列有多少个?
例如,对于字符串lanqiao,本质不同的递增子序列有21个。
它们分别是1、a^n>
q>
i、o、In、an、lq>
aq、nq、ai>
lo、ao>
no、io>
hiq>
anq^Ino、ano、aio«
请问对于以下字符串(共200个小写英文字母,分四行显示):
(如果你把以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。
在试题目录下有一个文件inc.txt,内容与下面的文本相同)tocyjkdzcieoiodfpbgcncsijblunugdnojjddhllnofawllbhfiadgdcdjstemphnmjihecoapdjjipiTqiiligccevdamfiiiliqijgililifgdcnixvicfauachlifliafjpdccfseflcdgjncadfclvfiiiadvniaaahaliiidsikzssoyx\'
akgiifjjailitniphs'
oulxbaeqkqlif\vl本质不同的递增子序列有多少个?
我们先考虑如果出现重复的字符串怎么办:
比如axxbxxxb,那么有两个ab递增子序列,则对于该ab递增子序列,在其后面延展字母构成新的递增子序列个数我们可以发现肯定是前一个ab的递增子序列的个数要>
=第二个的,可以说第二个的答案是第一个是子集。
那么我们对于同一种的递增子序列我们只需要记录其最早出现的即可,后续的出现也不需要管了。
基于上述所讲,我们可以使用BFS,使用队列,队列内记录字符串以及该递增子序列最后一个字符的位置,对于每次队首的字符串s,其末尾位置设为t,我们只需要从t+1到s.size()・l位置找到任何比s[t]大的即可插入到队列中去,这个过程进行去重、计数即可。
3616159
#include<
map>
map<
string,int>
mp;
stringstr;
intans=O;
cin»
str;
paii<
stringjnt>
>
fbr(inti=O;
=str.size()-l;
stiings-Ht;
s=s+str[i];
mp[s])
mp[s]++;
qu.push(make_pair(s,i));
ans++;
while(qu.sizeQ)
stringst=qu.front().first;
intii=qu.fiont().second;
fbr(iiiti=ii+l;
=str.sizeO-l;
if(str[i]>
str[ii]&
&
!
mp[st+sti-[i]])
mp[st+str[i]]=l;
qu.push(make_pair(st+str[i]4));
ans«
试题E:
玩具蛇
15分
小蓝有一条玩具蛇,一共有16节,上面标着数字1至16。
每一节都
是一个正方形的形状。
相邻的两节可以成直线或者成90度角。
小蓝还有一个4x4的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母A到P共16个字母。
小蓝可以折叠自己的玩具蛇放到盒子里面。
他发现,有很多种方案可以将玩具蛇放进去。
下图给出了两种方案:
A
1
B
2
c
3
I)
4
E
8
F
7
n
5
I
9
io
'
ll
L
12
M
16
“15
°
14
p
13
同样是BFS,从每一个格子开始,暴力就好
552
longlongans;
intdir[4][2]={{0,1},{1,0},{0,-1},{-1,0});
intvis[4][4];
voiddfs(intx,inty,intent)
if(x>
=4||y>
=4||x<
0||y<
0)
return;
if(cnt=16)
for(inti=0:
4:
intxx=x+dir[i][0];
intyy=y+dir[i][l];
if(vis[xx][yy])
vis[xx][yy]=l;
dfs(xx,yy,cnt+l);
vis[xx][yy]=O;
for(inti=0;
for(intj=0;
j-H-)
memset(vis,0,sizeof(vis));
vis[i][j>
l;
dfs(ij,l);
vis[i]D]=O;