第十三次CCF CSP认证(2018-3-18)体验

博主分享了参加CCF认证的经历,特别提到了四道题目的挑战:微信“跳一跳”计分、小球直线运动模拟、字符串处理及井字棋胜利条件分析。通过实战,博主总结了关于算法设计与实现的宝贵经验。

    这是我第二次参加,上一次是第十一次认证。

    第一题都是水题来的,不过出得比较有新意,是计算微信“跳一跳”的计分。

    第二题也不是很难,是假设小球在直线上移动,到达边界和碰到其他小球会弹开,这道题就是控制好方向就好了,然后注意边界的问题,前两道题,大概用了30分钟就可以写好了。

    然后可怕的事来了,第三题字符串处理,看题目感觉还行,真的做起来,发现拆分字符串后,要精准匹配有点难度,可能是之前删删改改太多了,自己的思路都改乱了,做了2小时,没有做出来,就放弃了。除了CCF练习网站,有人知道网上有什么地方可以练习字符串操作的吗?

    第四题看题目,也是一开始感觉很简单,是算井字棋胜利后,剩下还没下的地方,对于人脑来说,一眼就可以计算出来,但是还是真的做起题目来,发现有好多要判断的,加之随着时间的消逝,精力也在消逝,还有周围人的叹息声越来越多,想好好冷静下来,还真是不容易,反正到了最后我也没做出来,实力是真的不够,说好的图论呢,亏我备了一手深搜,广搜,最优二叉树,坐等网上出答案,要去好好学习学习。

    第五题,我没认真看,因为看了一下输入输出的内容长到不行,就苦笑了一下,没做了,回头再看看第三题。


    最后的结局,就是我发半小时做前两题,然后3个半小时做3和4题,没做出来,到底是实力不行,这次吸取的教训有,

  1. 第三题还是要好好先在纸上规划好再动笔好,因为字符串处理比较繁琐,很多细节要处理,做着做着,思路可能就丢了。
  2. 下次要想办法补充一下自己的精力,然后继续学习图论,因为往届还是图论考得多。
### 题目背景 西西艾弗岛运营公司是一家负责维护和运营岛上基础设施的大型企业,拥有数千名员工,公司内有很多 IT 系统。为实现这些 IT 系统的统一认证登录,公司 IT 部门决定引入一套 LDAP 系统来管理公司内的用户信息。轻型目录访问协议(Lightweight Directory Access Protocol,LDAP)是一种用于访问和维护目录服务的应用层协议,基于它的数据库可以用树形结构来组织和存储数据。每一笔数据,都包含了一个唯一的标识符(DN,Distinguished Name),以及一系列的属性(Attribute) [^2]。 ### 题目要求 寻找与对应的匹配表达式相匹配的用户的 DN,由小到大排序 [^1]。 ### 输入数据格式 接下来 n 行,每行包含空格分隔的若干个正整数,第一个正整数表示该用户的 DN,第二个正整数表示该用户具有的属性个数,此后的每两个正整数表示该用户具有的一个属性及其值。这些属性按照属性编号从小到大的顺序给出 [^3]。 ### 解题思路 - **数据结构选择**: - 为获取用户 DN 集合,创建 `map<int, set<int>> attrName_users` 表示该属性名对应的所有用户 DN,用于判断匹配具有该属性;创建 `map<int, map<int, set<int>>> attrName_attrVal_users` 实现属性名 - 属性值 - 用户 DN 集合的映射,用于判断该属性的值与输入的值是否相等 [^1]。 - 也可使用结构体数组和哈希表,定义结构体 `User` 包含用户标号 `DN` 和用哈希表 `unordered_map<LL, LL>` 存储属性和值 [^4]。 - **匹配表达式解析**: - 一个匹配表达式可以是一个属性的值,也可以是多个匹配表达式的逻辑组合。多个匹配表达式的逻辑组合是大的结构(分为与(`&`)和或(`|`),可转化为集合的交集和并集),每个小结构为匹配一个属性的值的表达式(分为断言和反断言) [^1]。 - 解析每个小结构里面的条件根据断言和反断言的定义来决定:断言操作符为 `:`,表示匹配具有该属性且值与之相等的用户;反断言操作符为 `~`,表示匹配具有该属性且值与之不等的用户 [^1]。 - 原子表达式处理可利用 `string` 中的 `find()` 函数找到 `:` 或 `~` 的位置下标,左边为 `key`,右边为 `value`,遍历结构体数组寻找匹配的用户。对于表达式的逻辑组合,如 `&(...)(...)` 提取左右括号内的字串,并递归求解 [^4]。 ### 代码示例 ```cpp #include <bits/stdc++.h> ``` ### 得分情况 从 20 分 + 运行超时(因为后面的输入没写就一直出不来)提升到 40 分,2.046s,之后可看满分代码学习 [^1]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值