CCF-CSP 往年真题 题解
文章平均质量分 58
此专栏是本人备考CCF时建立的,内容主要包含CSP认证历年的真题题解(主要是第3、4题),供大家学习交流。
Salmon_lee
这个作者很懒,什么都没留下…
展开
-
【CCF 201903-2】 二十四点(符号栈)
写在前面本题的常规做法是使用符号栈,特殊解法是使用Python的eval函数。算法思想将中缀表达式转化为后缀表达式,使用符号栈和数字栈。当新的符号op入栈时,有两种情况:① op的优先级 > 符号栈栈顶符号的优先级:直接入栈② op的优先级 ≤ 符号栈栈顶符号的优先级: 不断地将符号栈的元素弹出至数字栈,直到op的优先级 > 符号栈栈顶符号的优先级。...原创 2020-03-08 13:01:22 · 1605 阅读 · 0 评论 -
【CCF 201903-4】消息传递接口(队列)
本题思路思路较简单,用n个队列模拟n个进程;每轮循环考虑n个进程的当前指令,若两个进程的R、S相匹配,则可以出队;当一轮中没有匹配的进程时循环结束;最后查询所有队列,若都为空则不存在死锁;满分代码(C++11)#pragma GCC optimize(2)#pragma GCC optimize(3, "Ofast", "inline")#include &l...原创 2020-02-15 21:40:26 · 1387 阅读 · 0 评论 -
【CCF 201812-4】数据中心(Kruskal算法)
本题思路题意相当于:生成一棵树,要求这棵树的最长边最短,并求这条最长边的长度。Kruscal算法的模板题:首先对边进行排序,随后从小到大选取边,最终得到一棵生成树。贪心的做法使得每次选取的边都是最小的,且符合题意。满分代码(C++11)#pragma GCC optimize(3, "Ofast", "inline")#include <algorithm>...原创 2020-02-15 21:36:05 · 254 阅读 · 0 评论 -
【CCF 201812-3】CIDR合并(链表,位运算)
写在前面本题考查的是对STL::list的熟练运用,以及对位运算的思考;思路在题目中给出的提示当中已经非常清晰。解题思路将输入转化为list<前缀IP>struct Prefix{ vector<unsigned> ip; int len;}这里要分两种特殊情况:省略后缀型和省略长度型;我们使用的技术包括:字符串流stringstream、子串...原创 2020-02-15 15:13:09 · 331 阅读 · 0 评论 -
【CCF201909-4 推荐系统】
写在前面本题考察的是对数据结构的建构,以及对STL的熟练运用。没有选择正确的数据结构,将会导致本题超时。另外,此题的测试数据有误,在输出某一种类商品的编号时应当按照分数从高到低排序,分数相同时才按编号从小到大排序。如果按照原题意,只能得到60分。我的思路(超时)使用 unordered_map<id, score> map[type]; 存储物品在插入、删除时,只需要O(1...原创 2020-02-13 23:32:19 · 331 阅读 · 0 评论 -
【CCF 201912-4】区块链(队列:80分)
写在前面最近几次的CFF-CSP考试,我发现一个趋势。CSP的第3、4题会与计算机的专业知识密切相关。例如:化学方程式 – 编译原理,RAID5 – 操作系统。而本题涉及到的是分布式系统的应用(区块链)。题目大意给出一个网络,每个结点中都有一个主链。当一个结点的主链更新时,将会向它的邻居发送它的主链;邻居会将这个主链和邻居自己的链进行比较,决定是否接收这个链(即替换自己的链)。更新有...原创 2020-02-09 15:42:38 · 1299 阅读 · 0 评论 -
【CCF 201812-2】小明放学
此题和"小明上学"题干类似,不过我们需要模拟时间的流动来预测小明到达红绿灯时红绿灯的状态。这里我们增加了一个eclipse()函数来实现,实际上类似于状态机。思路详解把红绿灯的状态看成是<颜色k,剩余秒数t>,经过的时间是各个状态之间的转化边,那么我们可以描述一下红绿灯的有限状态机:初始状态为<红灯,30秒>,经过30秒后状态将变成<绿灯,g秒&...原创 2020-02-02 16:32:16 · 322 阅读 · 0 评论 -
【CCF 201903-3】损坏的RAID5
RAID5,对于学过操作系统的同学来说应该是比较熟悉的;如何根据块数确定该块所在的磁盘号和偏移量,是本题的难点。本题踩到的一些坑1. 关于输入的问题int num = 0;for (int i = 0; i < l; ++i){ // cin >> num >> disk[num]; 错误的写法 cin >> num;...原创 2020-02-02 11:01:48 · 346 阅读 · 0 评论 -
【CCF 201909-3】字符画(学习IO)
本题的思路不算难,但是需要快速完成需要对C++的IO库比较熟悉。本题用到的IO知识/* 打印字符c对应的<转移字符> */void out_char(char c){ // 16进制输出,大写字母,宽度2,填充0 cout << "\\x" << setiosflags(ios::uppercase) << setw(2) &...原创 2020-01-29 15:30:49 · 485 阅读 · 0 评论 -
【CCF 201912-3】化学方程式(递归下降)
题目描述第一行给出化学方程式的个数N,随后N行给出N个化学方程式。化学方程式的BNF文法如下: 问题分析类似于编译原理的语法分析,这里我们采用递归下降的方式解决问题。接下来,我们将以下面这个方程式为例来讲解我的思路。3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2Odeal_input(string input):处理输入的化学方程式首先将化学方程式根据"="划分成左右两...原创 2020-01-23 16:06:52 · 1483 阅读 · 0 评论 -
【CCF 201803-3】 URL映射
C++满分代码(思路都写在注释里了):#include <iostream>#include <cstring>#include <cctype>using namespace std;string result; //注意result是全局的 struct Match{ string line; //一行字符串 str...原创 2018-08-07 16:25:11 · 1180 阅读 · 0 评论 -
【CCF 201803-4】棋局评估(对抗搜索)
思路①当Alice下的时候,我们尝试所有可能的下法,并找到所有下法中使结果最大的一个当Bob下的时候,我们尝试所有可能的下法,并找到所有下法中使结果最小的一个②轮流执子,直到双方有人胜利或棋盘填满 蒟蒻我还是不能很好的表达出意思来...QAQC++满分代码(带注释)#include <iostream>using namespace std;cons...原创 2018-09-08 22:01:35 · 553 阅读 · 1 评论 -
【CCF 201712-3】 Crontab
写在前面这是一道恶心的大模拟,需要考虑到的细节非常多,博主在踩了很多坑之后终于得了100分,先放个截图:遇到的一些坑坑1:采用暴力法(超时,-25分)坑2:英文字母不区分大小写(没考虑,-20分)坑3:s可以取,t不可取(没考虑,-20分)坑4:注意有些year-month-day是不存在的坑5:时间相同时,按输入顺序排序输出解本题的两种思路①暴力模拟...原创 2018-08-08 13:48:14 · 1065 阅读 · 4 评论 -
【CCF 201709-3】JSON查询
思路1:并没有采用递归化的策略,而是根据查询直接在源字符串中查找。(90分)#include <iostream>#include <cstring>#include <vector>using namespace std;// esc\aped -> "esc\\aped":string sour(const string&...原创 2018-08-16 11:38:37 · 464 阅读 · 0 评论 -
【CCF 201703-3】Markdown
写在前面CCF第三题,一道相对简单的字符串模拟题思路每次先读取一行line,先把“强调”和“超链接”处理完毕,然后分3种情况处理:1.若line[0]为‘#’,说明是标题2.若line[0]为“*”,说明是列表,反复读取并处理直到空行3.说明是普通的段落,反复读取并处理直到空行测试数据C++代码#include <iostream>#...原创 2018-08-29 22:44:08 · 350 阅读 · 0 评论 -
【CCF 201612-3】权限查询
大致思路①P段是给出的基本权限,其实没有必要去处理,因为题目中告知:R段的信息一定是准确的。②处理R段时,使用map<string, map<string, int> > roleMap即每个Role对应一些权限,而权限的形式是:<权限名,等级>,其中等级为-1表示它是不分等级权限。③处理U段时,保存每个User对应的角色名称,采用map<...原创 2018-09-05 13:11:37 · 368 阅读 · 0 评论 -
【CCF 201609-3】炉石传说
本题并不难,只要按照题目要求模拟就好了。大致思路①用vector<People> player[2]代表2个玩家。int cur; //当前玩家 int wait; //等待玩家②People是他们的英雄和随从,拥有health、attack、position三个属性③Summon:将对应的People push_back到对应玩家即可④attack:找到对应的...原创 2018-09-05 16:50:10 · 400 阅读 · 0 评论 -
【CCF 201604-3】路径解析
大致思路①预处理当前目录将当前目录的路径都保存在一个vector<string> vec_cur中:将"/"替换为" ",然后用字符串流即可②预处理给定目录1.将"//"全部删除,将"/./"替换为"/"2.若给定目录为绝对路径:类似于①中方法将路径保存至vector<string> path中,其中遇到".."原创 2018-09-06 16:17:29 · 557 阅读 · 0 评论 -
【CCF 201512-3】画图
题目:http://118.190.20.162/view.page?gpid=T35大意:给定一些操作,需要输出最后画出的图案思路①初始化所有的图案为".",这里以a[i][j]作为坐标(i, j),输出时记得翻转一下②划线操作:首先要判断是水平/竖直,其次看需要划线的格子是否可能变为"+"③填充操作:其实就是DFS,遇到已经标记过的或者线段就停止总的来说,这题按部...原创 2018-09-09 17:13:55 · 432 阅读 · 0 评论 -
【CCF 201509-3】模板生成系统
大致思路预处理:key "value"使得key的形式为:{{ key }} "value"的形式为:value分别处理每一行①查找所有可能出现的{{ key }},将其替换为一个特殊的不可打印标记字符,而不是对应的value。把value压入vector<string> val,而这个特殊的不可打印标记字符就是:char(val.size()-1),标记了val...原创 2018-09-09 21:35:12 · 371 阅读 · 0 评论 -
【CCF 201604-4】游戏(BFS+优先队列)
写在前面写博客之前搜索了一下网解,发现大家都是BFS+三维vis过的:CCF201604-4 游戏(100分)这里分享一个BFS+优先队列的满分思路(如有错误请指正)大致思路每次从队列中找出d值最小的结点, 假设为u,由于使用的是优先队列,那么能够保证每次出队的u是最优的先驱。那么对于它的邻接结点v,有:①若v在u.d+1的时间可达,那么v.d = u.d+1,且这是它的...原创 2018-09-11 12:16:39 · 432 阅读 · 0 评论 -
【CCF 201412-3】集合竞价(模拟+DP)
大致思路预处理输入①开两个结构体数组rec[1000000]和tmp[5000],里面储存price(价格),buy_num(以此价格买入的数量),sell_num(以此价格卖出的数量)等信息,特别的:rec[i]保存的是当价格为i/100时的buy_num,sell_numtmp[i]保存的是第i行的信息②输入时:遇到buy或者sell,就分别在rec和tmp中储存相应的信...原创 2018-09-13 11:42:52 · 583 阅读 · 0 评论 -
【CCF 201412-4】最优灌溉(最小生成树)
最小生成树裸题,同【洛谷模板题 最小生成树】kruskal算法入门#include <iostream>#include <algorithm>#define endl "\n"using namespace std;struct Edge{ int start,end,length; bool operator < (const Edge&am...原创 2018-09-14 16:00:45 · 338 阅读 · 0 评论 -
【CCF 201409-3】字符串匹配
字符串模拟水题,只要合理的运用STL的函数即可#include <iostream>#include <cstring>#include <algorithm>using namespace std;int main(){ bool flag; int n; string a,b,alower,blower; cin>>a&...原创 2018-09-14 16:54:53 · 532 阅读 · 2 评论 -
【CCF 201403-3】 命令行选项
大致思路①标记数组记录选项的是否存在和是否带参数②写三个函数,分别判断 命令名、选项、参数 是否合法③利用字符串流stringstream处理每一行④用map<char, string>保存<选项,参数>,若无参数则为空C++满分代码#include <bits/stdc++.h>using namespace std;str...原创 2018-09-14 17:50:24 · 834 阅读 · 0 评论 -
【CCF 201712-4】行车路线(Dijkstra 80分)
忽略一个条件:可能具有连续的小路,跑一边裸的迪杰斯特拉算法,即可拿到80分注意:边权可能会爆int,采用long long才可以 #include <iostream>#include <cstring>using namespace std;const long long inf = 1e14;long long edge[505][505];...原创 2018-09-15 11:56:13 · 461 阅读 · 0 评论 -
【CCF 201312-3】 最大的矩形
思路DP,类似于 【洛谷P1020】导弹拦截(DP+贪心),O(n²)设dp[i]为包含横坐标i的最大矩形面积,则dp[i] = max{ (i-j+1)*min{Hi~Hj} } (j∈[0, i])#include <iostream>using namespace std;const int inf = 1e9;int a[1005];int dp[1...原创 2018-09-14 22:35:15 · 234 阅读 · 0 评论 -
【CCF 201709-4】通信网络(Warshall / DFS)
思路1用warshall算法求传递闭包,之后遍历邻接矩阵计算有几个部门能够访问到N个部门时间:O(n^3),显然超时,但是代码量短,水一点分数还是很值的。思路2在G中分别对所有结点进行DFS,再将所有边反向得到G^T,再次进行DFSDFS过程中能够连接到的点记录在标记数组中,得到传递闭包+对称闭包。时间:n*(n+m) = O(m*n),500ms,正好卡过Wa...原创 2018-09-15 12:02:49 · 252 阅读 · 0 评论 -
【CCF 201703-4】地铁修建(Kruskal 贪心 并查集)
题目抽象修建一条结点1到结点n的一条路,使得这条路上最大的边权最小思路从Kruskal算法得到启示,将边按权重排序,不断地加入最短的边,直到结点1到结点n连通即可判断是否连通的方法:使用并查集参考:【洛谷模板题 最小生成树】kruskal算法入门C++代码类似于Kruskal算法,只是结束条件不一样#include <iostream>#...原创 2018-09-15 12:10:20 · 596 阅读 · 0 评论 -
【CCF 201609-4】交通规划(最小的最短路径树 Dijkstra)
题目抽象要求所有结点与源结点连通,使得所有边权之和最小。即求最小的最短路径树。大致思路算法:通过Dijkstra算法可以构建最短路径树,如何保证这棵树最小呢?这就需要一些变形了:每个结点需要记录它的前驱边,每次松弛的条件是u.d + e ≤ v.d,若e比当前的前驱边短,则需要更新前驱边为e实现:由于n达到了10^4,因此需要采用队列优化(邻接表储存Edge的编号)...原创 2018-09-15 12:27:26 · 904 阅读 · 0 评论 -
【CCF 201509-4】高速公路(强连通分量)
题目抽象求有多少个结点对能够互相到达大致思路思路一【50分】:对每个结点DFS,求传递闭包,时间为O(V*E),代码简单,但是超时思路二【100分】:计算图的强连通分量(SCC),各个分量里面的点都是可以相互到达的SCC算法:O(V+E)强连通分量(Strongly Connected Components)①DFS求拓扑序(按u.f升序排列)②将图转置,按拓...原创 2018-09-15 18:28:05 · 368 阅读 · 0 评论 -
【CCF 201409-4】最优配餐(BFS)
大的思路:无权图的最短路径问题,BFS解决思路1:对所有分店为源点,进行BFS,找到每为顾客的最短距离。【超时】尝试减枝:每次BFS若遇到距离比原来的大,即停止搜索。【依旧超时】思路2:将所有的分店都加入队列,进行一次BFS【100分】#include <iostream>#include <iomanip>#include <cmath&g...原创 2018-09-15 21:29:30 · 583 阅读 · 0 评论 -
【CCF 201809-3】元素选择器
思路①处理每一行:每一行都处理为一个结构体,包含3个属性:级别(rank)、元素名称(element)、id名称级别 = 点的数量 / 2元素名称 & id名称 都可以通过字符串处理获得,若无ID则为空注意将元素名转为小写②处理树的结构:对于每一个结点v,找到它的前驱结点u,即向上找到第一个u.rank = v.rank -1③处理查询:利用stri...原创 2018-09-19 18:23:07 · 4604 阅读 · 0 评论 -
【CCF 201809-4】再买菜(记忆化搜索)
题意问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。 第一天,每个商店都自己定了一个正整数的价格。店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己和相邻商店的价格调整自己的价格。具体的,每家商店都会将第二天的菜价设置为自己和相邻商店第一天菜价的平均值(用去尾法取整)。 注意,编号为1的商店只有一个相邻的商店2,编号为n的商...原创 2018-09-19 18:45:05 · 2411 阅读 · 1 评论