zoukankan      html  css  js  c++  java
  • 【算法】算法是一种思维

    算法是一种思维。

    在下这段时间对算法的理解应该要归结于这样一句话
    大胆假设 小心论证嘛

    起初最早对算法有个概念 是贪心算法
    对贪心算法的表述
    百度百科是这样说的

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
    贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

    当时其实对这种说法还是一知半解的(现在好像也是)
    所以对算法到底是什么 一直得不到一个明确的答案

    在想明白之前
    在下感觉做题的收益有点低
    题目地址: HPU15级个人赛 (hpuacm)
    而这次的个人赛有八道题目
    在下结束之后忘了保存代码了
    而又感觉去网站提交记录找 没必要
    所以对于这些题目的代码
    应该会上传一个重新写的版本

    八道题目分别是:

    这里写图片描述
    就不一一截图了
    以后慢慢整理
    这篇文章就是从解题思路上来简单说说

    Problem A 利息计算 :

    作为一道纯粹的数学计算题
    一定程度上考察了对数据类型和输入输出的控制
    但是这种题目作为签到题本身
    我觉得更重要的目的是让自己找到感觉
    不至于在接下的答题中慌乱
    而这此次比赛我恰恰犯了这点错误
    对一团数字不加思考就选择先做B题
    然而……

    Problem B - 18岁生日 :

    在下这次个人赛的噩梦之源
    又是一个关于闰年的问题
    从这一题
    在下第一次知道闰年并不是严格的四年一次

    一个回归年不是365天,而是365天5小时48分46秒,多出的时间就会累积起来,新年就会后移,所以每隔四年就设一个闰年,这一年的二月改为29天.这样,闰年就有366天.但是,这样每一百年又差不多多了一天,所以又规定”百年”不设闰,即”百年24闰”.但百年扣一天闰还是不刚好,于是又规定,公元年数为400倍数者设闰.

    而我原先一直以为 1900 不是闰年是个数学问题
    也就是1988 1902都是闰年(其实并不是)
    但是经过这次教训也是学习了

    同时更深层次的
    也是对自己的一个教训
    太过自信了
    也就是过于相信自己是知道出题人的想法的
    (不一定被4整除 被100整除的还要能被400整除)
    本来一般的题目这种想法就够了
    然而这一题我所采用的方法
    恰恰用到了四年一闰这个思想
    (这个想法是错误的)
    具体解法讨论见题解文章

    Problem C - Magic Spheres

    这一题也是迷之WA
    各种情况都想不通
    然后发现了一句……

    he needs at least x blue, y violet and z orange spheres.

    重点是……

    at least

    也就是上面的数据没必要完全等于下面的
    只要能把上面变化成大于等于下面的就好了
    然而给的两组Yes的数据全部满足
    等于下面的
    所以导致对题目理解错误……
    想想原因
    就是对于这种英文题目
    我一般是对照输入输入猜题目意思
    所以导致了先入为主的思想
    这也是以后面对英文需要警醒的一件事情

    Problem D - The Best Gift

    这一题神奇之处在于
    我竟然没用到题目给的m就顺利AC了-.-

    Problem E - Red and Black

    这题是道经典的搜索题

    Problem F - Load Balancing

    负载均衡 序列平衡的一种算法
    当时比赛因为前面用的时间太长了
    导致这一题都没时间看了……
    (主要也是看到别人都WA了好多 就没写)

    Problem G - The Suspects

    按照题意应该是并查集
    不过当时我的第一眼思路是往搜索想的
    最终也是做出来了

    Problem H - Networking

    最小生成树问题
    之前做过类似的了

    经过这八道题
    其实我在思考到底什么是算法
    如果它只是一种解题方法的话
    我觉得似乎并不恰当

    比如有些题目 如
    Problem G - The Suspects
    属于简单的并查集
    但如果用搜索却也并不难理解

    又或者
    Problem E - Red and Black
    属于搜索 但bfs dfs却都可以解答

    那么 什么是算法
    我认为把算法归结为一种解题思维
    或许更加恰当

    也就是 不需要把算法看做一种模板 而是一种解题的思路
    区别是什么呢
    我觉得就是判断一道题是像是某某算法的题目
    脑海里第一意识出现的是算法的思想 还是算法的代码框架

    我觉得更好的情况还是理解算法的本质
    这样无论题目千变万化 总可以找到解题的钥匙
    而不用纠结于它到底符合哪一个模板

    算法是一种思维
    这便是我现阶段对算法的理解
    先照着这条路走吧
    然后慢慢修正自己的观点

    更何况
    无论怎样理解
    对一个算法还是要认真学习的
    甚至说更加努力的去学习
    探究其本质的一些东西

    话说我最近貌似开始养成
    把一篇文章分成几天来写的习惯了-.-
    貌似有时候会影响思路~
    哈哈哈
    尽量还是一口气写完吧~
    适当补充还是可以的

  • 相关阅读:
    邮件发送携带附件
    两个文件内容同行合并操作
    re模块,判断某行/某字符是否存在
    企业微信公众号告警Python脚本
    CodeForces 371D. Vessels 题解
    免安装 mysql
    kibana dev tools 操作 Elasticsearch
    win10 强制关掉被占用的端口
    值传递与引用传递
    微服务网关 soul
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569918.html
Copyright © 2011-2022 走看看