今天没有看榜,佛系写题,决定要当天写完今天的总结。
B - Orders
题目大意:
输出一个字符串从小到大的全排列,而且不能输出重复的排列
思路:
- next_permutation(first,last)函数会取得从first到last所标示之序列的下一个排列,如果没有下一个,便返回false,否则返回true
- 昨儿本大爷宁死不屈没有用next_permutation()函数今天这么水的题我就是要用用。
- 话说18届怎么给下一届出题这么简单呢
C - Lake Counting
题目大意:
找n*m的矩阵有多少个八个方向相连的‘w’块:
如图有3个‘w’块(csdn的编辑器插图片之后就很鬼畜)
思路:
矩阵+深搜或广搜模板题,手打了一遍模板,打完检查之后都没问题结果输出0。后来发现题目的w居然是大写W,气笑我了。
艾玛,交完这题之后偷偷看了眼榜hhhhh
D - Tempter of the Bone
题目大意:
给你一个矩阵,再给你一个起点一个终点,还有障碍物,同时限制你的步数固定为某个常数,问你可不可以不走回头路的到达终点。
思路:
- 为了使步数尽量少就能到达终点就广搜好了,然后搜的时候记录对比一下当前深度和限制步数就可
- 不对,看错题了,不是限制步数,而是固定步数,那广搜就没有用了
- 后来发现这个题有坑,门有可能不在边上而是在矩阵内部,这时候是可以走过门的,这样的话搜的时候要特判一下,如果走到门分两种情况,达到制定指定步数 和 没达到指定步数,达到就完事了但没达到的话就继续深搜且不要标记已走过此点
- 并且这题运用了三种剪枝,在数据很冗余的时候可以大幅度提升效率的
- 第一种叫做奇偶剪枝,在走迷宫题很受用
- 第二种叫出逃剪枝,此题问能不能走到,所以找到第一条能走到的路的时候flag就标记为1,回溯的时候如果发现flag==1了就直接return跳出dfs了。
- 第三种叫
- 第一次提交TLE了,结果发现数据的读入本来就是有问题的,原来是while的最后没有继续读入新的n,m和t所以导致了测评机超时的判定。
- 改完之后提交变成了Output Limit Exceeded,这我真的服了,明明格式没有错误啊,每次这样我都觉得自己身上有魔咒,别人的代码永远是对的而只要经过了我的手就一定不能A
- 另外我还发现scanf("%c",&map[ i ][ j ]); 在这题不能用,要用cin>>map[ i ][ j ]才行。
- 在我把输出改成cout之后又变成TLE了。。
- 在改动了一个<=变成<的错误之后还是TLE。。。
- 啊啊啊啊啊我用自己的代码AC啦!!经过我打破沙锅死磕到底的通过对换我和AC代码之间的代码块,我终于发现我TLE的原因竟然不是逻辑错误不是算法错误,竟然是这两者的区别:
别人的AC代码:
while( cin >> n >> m >> t){
if( n==0 && m==0 && t==0 )
break;
......
}
我的TLE代码:
scanf("%d%d%d",&n,&m,&t);
while (n!=0 && m!=0 && t!=0){
scanf("%d%d%d",&n,&m,&t);
}
不是说scanf比cin快的嘛??这是怎么回事广大网友能不能给个解?
总结:
- memset在的头文件里,<string.h>也可以
- next_permutation(first,last)函数会取得从first到last所标示之序列的下一个排列,如果没有下一个,便返回false,否则返回true
- 有next就会有prev,prev_permutation(first,last)则是取得前一个排列,然后没有就返回false,否则true
- 符串不要用scanf,用cin或者别的函数
- do-while语句末尾居然有分号;
- 字符串也可以用sort和 s.begin()呢,额你好像还没复习STL——string呢吧
- get判断是否为偶数的新理论:与1求位运算的&,如果tmp & 1=1则tmp是奇数(二进制末位为1的都是奇数) 位运算判断是否为奇数,比mod(求余数)更快.
- 就在这时候外公已经装好wifi了,不知道他出去到处找开门的卖路由器的地方找了多久,商店的年轻人有没有嫌他听不懂,有没有因此骗外公多买套餐,外公有没有听着年轻人的话心里乐开了花花了大笔钱给我买了最贵的套餐,然后赶回来给我安装。我活成这样真特么是个人渣
- 外公那一辈人爱我们的方式就是体恤你在吃穿住行上的需求然后义无反顾的满足你,他不知道你对这些毫不在乎,也不知道你心里到底想要什么。所以有一天你告诉了他闷一个吃穿住行以外的需求,他们就会拼了命地拿到你面前。
10.不说了,泪目