总结博客3

这是我的第三篇总结博客。这周按照老师的要求,至少看50篇博客或者题解,我想我应该有做到。这其中包括了一部分搜索题解(绝大多数),还有几篇关于二分的博客和题解,再就是看了几篇思维题目。

这周看的博客或题解主要还是集中在搜索的题目里。关于搜索我之前也有所接触,但没有一个周看如此多的有关搜索的题目。对于这些题目,我总结了以下几点。

1、首先是思维,思维在做题目的时候是非常重要的。比如

题意:在一个数轴上,给出人和牛的位置,每次人可以从当前位置p走到p+1或p-1或2*p的位置,问能抓到牛的最少移动次数。

当我看到这道题时,我首先想到的不是搜索,而是2*p肯定比p+1来的快,于是判断2*p与牛的位置的大小,如果小,呢我们就*2,如果大,我们就判断先超过再退回来步数少还是直接过去步数少。这是我一开始的想法。但因为我就是看的搜索专题哈,所以这道题的题解肯定是用搜索的知识完成的。根据我这周学习搜索的经验发现,一般涉及这种最少移动次数,基本上都是bfs,而呢种问有多少种方法的,接你就时dfs啦。我想我的呢种方法应该有他的不足之处。所以说我们要拓展我们的思维。

2、关于搜索题目的基本套路。其实搜索的基本套路很容易记住,也很容易写出来。但是呢其中的判断条件以及变量的处理确是真正的核心内容。比如对于多维,多个变量,多个数据成为一体时操作,我们就可以定义一个结构体。说到这里,我今天在打牛客网的呢个比赛时确实有这样一个关于广度搜索的题目,其中就是三维空间,就需要自己定义一个结构体来储存坐标点。但我今天做这道题目是碰见了我从来没有碰见过的问题,内存超过了限制,当时我就不知道该怎么处理了。害,说到底还是水平不够啊。

3、看题解是一定要有耐心,不管题解多长,题解有没有注释,我们一定要有耐心。我每次看题解时都是先浏览一下,先看看主函数在哪,都有什么函数,在什么位置说明的,但当我看到下面这个代码时,我的内心是十分崩溃的。

 while (first<len)
        {
             opt t = q[first];
            first++;
            if (t.a == C || t.b == C)
             {
                 flag = true;
                ed = t;
                break;
            }
             if (t.a == 0 && t.b == 0)
             {
                 if(!vis[A][0])q[len++]=opt(A, 0,'f','1','1',first-1,t.cnt+1),vis[A][0]=true;
                 if(!vis[0][B])q[len++]=opt(0, B, 'f', '2','2', first - 1, t.cnt + 1),vis[0][B]=true;
             }
             else if(t.a==0)
             {
                 int ta = min(A,t.b), tb = (min(A, t.b) == A ? t.b - A : 0);
                 if(!vis[ta][tb])q[len++]=opt(ta,tb, 'p', '2', '1', first - 1, t.cnt + 1),vis[ta][tb]=true;
                 if(!vis[A][t.b])q[len++]=opt(A, t.b, 'f', '1', '1', first - 1, t.cnt + 1),vis[A][t.b]=true;
                 if(!vis[0][B])q[len++]=opt(0, B, 'f', '2', '2', first - 1, t.cnt + 1),vis[0][B]=true;
             }
             else if (t.b == 0)
             {
                 int ta = (min(t.a, B) == t.a ? 0 : t.a - B),tb= min(t.a, B);
                 if(!vis[ta][tb])q[len++]=opt(ta,tb, 'p', '1', '2', first - 1, t.cnt + 1),vis[ta][tb]=true;
                 if (!vis[t.a][B])q[len++]=opt(t.a,B, 'f', '2', '2', first - 1, t.cnt + 1), vis[t.a][B] = true;
                 if (!vis[A][0])q[len++]=opt(A, 0, 'f', '1', '1', first - 1, t.cnt + 1), vis[A][0] = true;
             }
             else
             {
                 if (!vis[t.a][0])q[len++]=opt(t.a, 0, 'd', '2', '2', first - 1, t.cnt + 1), vis[t.a][0] = true;
                 if (!vis[0][t.b])q[len++]=opt(0, t.b, 'd', '1', '1', first - 1, t.cnt + 1), vis[0][t.b] = true;
                 if (!vis[t.a][B])q[len++] = opt(t.a, B, 'f', '2', '2', first - 1, t.cnt + 1), vis[t.a][B] = true;
                 if (!vis[A][t.b]) q[len++] = opt(A, t.b, 'f', '1', '1', first - 1, t.cnt + 1), vis[A][t.b] = true;
                 int ta=(t.b-(A-t.a)>=0?A:t.a+t.b), tb=(t.b-(A-t.a)>=0?t.b-(A-t.a):0);
                 if (!vis[ta][tb])q[len++] = opt(ta, tb, 'p', '2', '1', first - 1, t.cnt + 1), vis[ta][tb] = true;
                 ta = (t.a - (B - t.b) >= 0 ? t.a - (B - t.b) : 0), tb = (t.a - (B - t.b) >= 0 ? B : t.b + t.a);
                 if (!vis[ta][tb])q[len++] = opt(ta, tb, 'p', '1', '2', first - 1, t.cnt + 1), vis[ta][tb] = true;
             }
         }

当时我的头直接变大两倍,内心十分崩溃,我不敢相信这是搜索里的题目。 但其实当你耐下心来,仔细去看她的时候,就会发现其实它并没有想象中的呢么难懂。所以说我们再看题解的时候一定要有耐心,这在我们做题目时也要耐心看题目,不能因为想破解写代码而粗略地看题目。这在我本周四晚上的比赛中深有体会。就是因为我没看到B题目中的一句重要的话,以至于很长时间AC不了。(虽然最后只做出两道题)

4、最后就是我自己总结的关于什么时候用搜索的一点点技巧吧,(不知道准不准,因为没有试验过)。比如那我们再题目中碰到迷宫,或者题意中让你求有几种,几个,关于多少种的,首先往深搜上想一想。再就是,最少几种,最少几步,最少怎样怎样,一般求最少的,就往广搜靠一靠,想一想。(也有可能是我目前水平不够,看的题目太少,总结的不怎么对,谨慎参考)

本周呢看的算法不多,可以说基本上没看算法,主要集中在搜索上,涉及了一点其他内容,还有就是通过两次比赛发现,我过得题目基本上通过率都很高,90左右吧,但那些通过率5、60左右的题目我就不回了,但也不是一点也不会,有的样例可以过,但是实际提交是超时的。最终还是自己的算法知识不够多,思维不够。所以说还是提高自己的实力吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值