初看这道题的时限就很警觉,暴力枚举铁定超时。于是在想如何优化。枚举的五层循环最内层其实是多余的,因为x5可以直接求出来。于是弄出了108的算法,无奈常系数太大,依然超时。其实如果我能放弃掉解方程的思想,转而去重视移项,应该就会很快得到正解。正解是用哈希(Hash),将方程左边的后三项移到右边,然后枚举x1和x2得到此式左边的值,做哈希。预处理过后就枚举右边三个变元求和,如果能与左边出现过的值相等则存在某些数量的相应解。规模是106,系数再大都超不了时了。我实现的时候偷了懒,没有做哈希(O(1)),直接用了STL里的map(O(lg n)),速度也还可以。
转化的思想依然很重要。这让我联想到SRM 440的那道物理题,我推了半天公式没弄出来最后放弃掉。实际上二分枚举就可以了。这就是需要思维的变换,不能直接顺着题意走,有时候需要重新从另一个角度建模,进行转化。二分确实是一个很有用的东西,对于可以构造出单调性的优化问题很有效。当然本题与二分无关……扯远了……
点击这里查看poj_1840.cpp(780K,2766MS)