哈哈,能得到杨大哥的肯定,真是我的荣幸。
我的代码里最精华的两个函数应该就算是find_target和find_perfect了。
find_target这个函数的作用就是寻找合适的lakeside城市,所谓的合适就是该城市L左边和右边的海拔都比L自己低。我只把这些城市当作目标。
算法核心是find_answer这个函数,这个函数的作用是从find_target寻找到的目标开始遍历整个图,看看这个目标能覆盖多少沙漠城市D(desert),并且用scope来记录这个L覆盖的范围,即从哪个城市到哪个城市。
这里有个非常重要的结论,也就是杨大哥所说的:
举个例子,如果某个L所能覆盖的范围是1,2,4,5,6这5个城市,那么其他的任何一个滨湖城市是不可能覆盖到3这个城市的,为什么呢?因为水流是连续的,既然水流已经通过某些途径覆盖了2和4这两个城市,那么3这个城市已经被包围起来了,其他的滨湖城市是不可能覆盖到3这个城市的,并且L右边的下一个滨湖城市所能覆盖到最左边的沙漠城市不可能比L所能覆盖的最左边的沙漠城市更左,因为水流是连续的,L右边的水流都能流过去,那么必然跟L的水流是有交点的,即则
右侧的L结点所覆盖的D线段的左端,不可能超过左侧的L结点所覆盖的D线段的左端。
所以,在结果中,我先是调用find_result这个函数,来确认是否是有没有被覆盖到的城市,如果有则统计个数,然后打印结果,结束程序。
如果每个沙漠城市都能被覆盖,那么每个L的覆盖结果必然是连续的,即
每个L结点所覆盖的D结点必定相邻可以连成一条线段。那么就调用find_perfect这个函数,这个函数是来统计最少的城市个数的。
如何来统计呢?大家仔细阅读find_perfect这个函数就能找到答案。
再次感谢杨大哥阅读我的代码。