第十一届蓝桥杯国赛C/C++ B组 部分题解(仅供参考/更新中...)

搜索杯(这届也可以说是DP杯) 它回来了!!!

A. 美丽的2(5分)

题意:数1-2020年中数位包含2的年份有多少个。

思路:签到题就没啥好说的了。

Ans:563

#include
using namespace std;

bool check(int x){
     
    while(x){
     
        if(x%10 == 2) return true;
        x /= 10;
    }
    return false;
}
signed main(){
     
    int res = 0;
    for(int i = 1 ; i <= 2020 ; i ++)
        res += check(i);
    cout<<res<<endl;
	return 0;
}
/**
563
**/

B. 扩散(5分)

题意:无限大的网格,给定四个初始点为黑色格子,每分钟都可以向四个方向扩散,问2020分钟后,总共有多少个黑格子。

思路:dfs,由不同初始格子扩散到的点打上不同标记。扩散到没标记过的就答案+1就好了,这题都不知道做对了没,题目也没说格子有没有负数坐标的(想想5分题,不至于搞个坐标平移吧)。

Ans: 2066591

在这里插入代码片

C. 阶乘约数(10分)

题意:求 100!总共有多少个约数(因子)

思路:对于一个数X,分解质因子 X = Pk1Pk2Pk3,那么约数总个数就是(k1+1)*(k2+1)*(k3+1),对于100的阶乘,把(1-100)分别分解质因子,然后所有质因子的个数统计一下,最后乘起来。(前一天晚上刚和室友讲了怎么求一个数的约数个数。结果就考到了。)

Ans:39001250856960000

在这里插入代码片

D. 本质上升序列(10分/15分 记不清了)

题意:对于给定的那个不算很长的字符串,求总共有多少个本质不同的严格上升的子序列。本质不同也就是长得不一样就行。

思路:显然是一个DP。感觉也可以搜索。不知道会不会爆。对于本质不同的串,开map标记一下就行。不过程序复杂度太高,跑了几分钟才出结果。

Ans:3616159

在这里插入代码片

E. 玩具蛇(15分)

题意:把1-16个数字填入4x4的方格中,要求相邻的数在表格中的位置相邻就好了,求共多少种摆法。

思路:显然是dfs,甚至都不需要记忆化状压之类的骚操作。每次按顺序往相邻位置填数,填到16的就是合法方案。不合法的情况都会提前退出。

Ans:552

#include 
using namespace std;
int mark[100][100];
int dir[][2] = {
     0,1,1,0,-1,0,0,-1};
int res = 0;

bool check(int x,int y){
     
    return x >=0 && y >= 0 && x < 4 && y < 4;
}

void show(){
     
    for(int i = 0 ; i < 4 ; i ++){
     
        for(int j = 0 ; j < 4 ; j ++){
     
            printf("%3d",mark[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void dfs(int x,int y,int id){
     
    mark[x][y] = id;
    if(id == 16){
     
        res ++;
        show();
        mark[x][y] = 0;
        return ;
    }
    for(int i = 0 ; i < 4 ; i ++){
     
        int xx = x+dir[i][0];
        int yy = y+dir[i][1];
        if(check(xx,yy) && !mark[xx][yy]){
     
            dfs(xx,yy,id+1);
        }
    }
    mark[x][y] = 0;
}

int main()
{
     
    for(int i = 0 ; i < 4 ; i ++){
     
        for(int j = 0 ; j < 4 ; j ++){
     
            dfs(i,j,1);
        }
    }
    cout<<res<<endl;
    return 0;
}

F. 皮亚诺曲线(15分)

题意:神仙题,看到就直接跳过了,相信也没啥人写。就不说了。

G. 游园安排(15分/20分 记不清了)

题意:给定一个字符串,里面包含N多个人名,每个人名的首字母都是大写的。求 人名 的最长上升子序列。如果有长度相同的字符列,取字典序最小的。

思路:预处理字符串,然后求LIS就好了,怎么老喜欢一场比赛考相同的知识点呢。至于字典序最小,我是在DP的过程中连同LIS一起记录。显然会超时或者爆内存。不过时间复杂度反正也过不去大数据,无所谓了。改的话可以改成对每个位置记录前驱,最后原路返回输出答案。

Ans:

在这里插入代码片

H. 答疑(20分)

题意:每个人有三个时间,s,t,e,然后排队进办公室后经过 s+t 的时间,就去班群冒个泡,冒泡持续 e 的时间,求 怎么合理安排顺序,使得每个人发消息的时间点 总和最小。

思路:好像写错了。我也就排了个序,怎么说这20分的题不至于这么水吧。而且数据最大给的1000。难道不是给的n2时间吗(莫非是考冒泡排序)。然而并没有什么别的思路

Ans:

在这里插入代码片

I. 出租车(25分)

吐槽:理论上是个bfs,最后一小时写的,码了40分钟,无果,遂放弃。

J. 质数行者(25分)

题意:三维的网格。从左下角走到右上角。每次可以往三个方向走,但是一步只能走质数长度的,且中间有两个点不可到达。

思路:很容易想到DP吧,但是给的数据很大,DP只能过小数据。处理一下质数,然后根据二维走方格的算法推到三维就好了。

Ans:

在这里插入代码片

运气好,水了个国一。

你可能感兴趣的:(比赛经验总结,算法练习)