不发代码的解题报告

【前言】

 

由于有很多题都是不值得详细写解题报告的。

或者说有的题我是抄了别人的代码所以也不怎么好写。

所以决定开一篇只写思路的解题报告列表。

做过的有点意义的题就写个思路。

如果太有意义的话自然会写一篇比较完整的解题报告。

 

【以下·开始】

 

POJ1426

 

      广搜。每一个数,从0开始广搜,状态转移为 F = F * 10 + 0 和 F = F * 10 + 1。其实就是简单地从0开始模拟。

      注意用STL会超时,所以还是动手开个数组亲自写个队列吧!

      此外还要注意用64位整型,避免溢出。

      有个技巧就是先遍历一遍[1,200],把结果存到数组里,询问的时候O(1)的复杂度输出结果。

 

POJ3635

 

      DP+优先队列。DP的思想就是用D[i][j]表示第i座城市剩余j油量的最小花费。其实这道题类似于Dijkstra之类的变种。从出发点开始,每次油量加一,更新对应的D[i][j+1]状态,如果有更新则将其放入队列;同时扫描邻接城市,对能够在此油量下到达的城市进行更新,同样,如果有更新则将其放入队列。队列维护的是最小花费(关于某个城市某个剩余量)。经过不断地松弛,直到到达目的城市则得到结果。

      如果队列中已存在某个节点,则不需要对它进行操作。

      由于本题中城市数量比较多,注意要用邻接表而不要用邻接矩阵,否则会超时。

      STL中的priority_queue是个很好用的东西。

     

HDU2955

 

      DP。主要的是反过来想。把获得的金钱作为数组下标,计算所能达到的安全性,而不是计算被抓获的概率。

 

HDU1204

 

      DP。和HDU2955类似。计算无法申请到的最小概率,便可求出至少获得一份offer的概率。

 

HDU1712

 

      DP。简单DP,用数组存放第i天的最大profile。对每一个课程,每天都进行一次全课程的扫描。

 

HDU3033

 

      分组且每组至少选一的DP。状态转移方程为dp[i][j] = max(dp[i][j], max(dp[i-1][j-price[i][x]], dp[i][j-price[i][x]])+value[i][x])。这个状态转移方程其实是不难得到的。不过转移的时候要特别注意。题目的意思是每组至少要选择一个。可以使用滚动数组的形式。

 

HDU3496

 

      限制最大选择个数的DP。对于每一个DVD均对前i个的dp数组进行扫描,维护m个DVD的数组。


POJ2349


      求最小生成树的第s大的边。


POJ2492


      并查集,不过要注意分析好合并时的情况。


POJ3232


      二分。判断条件:(1)是否存在全程加速也无法到达的路程。(2)是否存在同时使用超过m个加速器的情况。


POJ3669


      BFS。不过数据有误,需要把范围增加到400。


POJ2081


      hash或map。如果使用stl中的map、hash_map之类的,占用的空间和使用的时间都是比较大的,虽然可以通过。可以自己开个数组自己模拟hash。

      由于不知道hash表应该开到多大,所以可以事先运算出所需要的最大值,根据这个值开到足够大的hash表就可以了。


POJ1794


      简单的排序题。

      设每次录入的两个整数分别为x和y,并看成一个整体。对点集进行y的升序排列,当y相等时对x进行降序排列。之后计算x序列的逆序数。可用归并排序解决。


POJ1654


      叉乘计算多边形面积。

      多边形的面积可以用叉乘计算。把多边形分解为从原点出发的多个三角形。对于多边形的每条边的两个端点Pi和Pi+1,(P[i].x*P[i+1].y)-(P[i+1].x*P[i].y)则可得到该边与原点所成平行四边形的面积(有正负之分),除以二则为三角形面积。然后对所有边进行计算即可得到总面积。不过要加个正负的判断,如果为负则取其相反数。


POJ3026


      BFS+PRIM。

      从每个S或A的点出发,bfs找到其到其他各S或A的最短距离并保存起来。假设S和A的个数总共有n个,则最终形成一个n*n的邻接矩阵。

      以S为起始点,在这个邻接矩阵上进行prim算法的运算。即可得到结果。


POJ1840


      hash。

      枚举前两个数,把结果放进哈希表,记录个数。再枚举后三个,如果结果的相反数可以在哈希表里找到,则加上该哈希值的个数。


POJ1548


      贪心。

      每次寻找最边缘的一条线,即围住左下空白的一个边缘即为一个robot所能覆盖的路径。之后把这些点取消掉继续查找,记录个数即为答案。


你可能感兴趣的:(不发代码的解题报告)