2月24-第二次机试课记录
总结
- 模拟的优化可以考虑使用STL来减少时间复杂度
- 对于时间复杂度的减低
- 在方法上,对n减低到logn这类思路上的转变
- 还要考虑各种细节,比如
- 输入输出,使用printf而不是cout
- mp.count()反而是多余的判断
- 使用unordered_map
- 对于题目有的时候可以从别的角度进行模拟的思考,比如网络那题,从枚举的角度进行bfs比倒bfs更简化
- 模拟的优化,在进制转换那题数据量大的提示,就告诉了需要从新的角度去思考
题目序号
-
简单
- PIPIOJ 1332 反转括号之间的子串(stack+string)
- PIPIOJ 1334 PIPI计数(map)
- PIPIOJ 1065 统计气球(map)
- PIPIOJ 1070 PIPI的数组 (map+vector)
- PIPIOJ 1037 排名(sort)
- PIPIOJ 1150 整数排序(sort , string)
-
难题
- PIPIOJ 1325 社交网络(queue)
- PIPIOJ 1114 十六进制转换 (map+string)
- PIPIOJ 1173 PIPI的集合(unordered_map)
- PIPIOJ 1330 PIPI的乐高积木(set)
思路与技巧
-
1332
- 使用char *进行字符串的保存,故接收一行需要使用gets();
- 使用stl中的reverse(a, b)将[a, b)直接的进行反转
char str[100]; gets(str); reverse(str + a, str + b);
-
1325
-
最开始的想法是进行倒bfs,逆推回去,但是代码太繁琐了,参考答案是枚举每个中毒的点,进行bfs模拟和结果对比,bfs的时间复杂度是O(点数+边数),再乘上感染数,不会超时
-
因为点比边多,可以使用vector进行邻接表的声明,同时注意到是无向图,要存储两次
-
bfs需要使用vis数组防止重复访问点,并且使用memset初始化vis数组从而可以多次使用
-
-
1037
- 需要c++中string重载了大于符号,如果使用char需要使用strcmp进行比较,否则只是比较指针指向
-
1114
-
之前在杭电做过一题数据量小的,可以通过格式化输入输出简化,但是这题数据量大,只能考虑进行模拟,如果直接进行10进制模拟还是会越界,所以考虑直接进行二进制模拟,如何使用map简化模拟过程
scanf("%x", &a); printf("%o", a);
-
-
1173
-
一个思路上进行预处理,从而将时间复杂度从O(n4)降到O(n2)
-
几个容易TLE的点
-
使用unordered_map(map重复使用需要clear)
-
初始化在主函数外,避免重复定义
-
mp.count(key)判断后在加会有问题,因该直接加mp[key]
-
-
-
1330
- 很经典的使用set的题目,因为需要返回对排序的组件删除和添加,故使用set(内部自带排序)进行操作,每次操作都是o(logn)