【前言】
由于有很多题都是不值得详细写解题报告的。
或者说有的题我是抄了别人的代码所以也不怎么好写。
所以决定开一篇只写思路的解题报告列表。
做过的有点意义的题就写个思路。
如果太有意义的话自然会写一篇比较完整的解题报告。
【以下·开始】
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所能覆盖的路径。之后把这些点取消掉继续查找,记录个数即为答案。