题目解答
第一个计算几何问题,计算几何问题必须要“踏踏实实”的来,但是也有优化。对于本题目,我使用的是2分法。(我只想到了这个方法,听说还有强大的类似线段树的方法)。首先第一问:使用叉积判断任意两条线段是否绝对相交,若有则输出“NOFENCE”并结束。重点是第二问。观察下图。我们可以很清楚的知道,如果一条线段可以被观察到,他的视野一定不为0,因此,我们只要先找到待观察线段的中点,并与观察点连线就能得到一条新的线段(中位线)。并用新的线段与其它所有线段进行绝对相交判断。同时还要考虑非绝对相交,被点挡住的情况。如果有中位线满足不与所有点相交,那么他一定可以被看到。否则2分。边界条件是两个端点挨在一起了,说明没有满足。这时就要考虑控制精度了。一旦精度过高就会超时。反之就会漏解。(0.005就不错(^o^))具体的实现请看程序。
提一句输出:我们按顺序2分,这样在输出序列里的就是有序的,只是当最后的结点坐标一样时要按输入文件的顺序输出。而只有当第(N-1)与第N个同时要输出时才会不满足(至于为什么不多作解释)。这时先输出N,再输出(N-1)
运行结果
Compiling…
Compile: OK
Executing…
Test 1: TEST OK [0.011 secs, 2940 KB]
Test 2: TEST OK [0.011 secs, 2940 KB]
Test 3: TEST OK [0.000 secs, 2940 KB]
Test 4: TEST OK [0.022 secs, 2940 KB]
Test 5: TEST OK [0.000 secs, 2940 KB]
Test 6: TEST OK [0.054 secs, 2940 KB]
Test 7: TEST OK [0.216 secs, 2940 KB]
Test 8: TEST OK [0.194 secs, 2940 KB]
Test 9: TEST OK [0.194 secs, 2940 KB]
Test 10: TEST OK [0.270 secs, 2940 KB]
Test 11: TEST OK [0.000 secs, 2940 KB]
Test 12: TEST OK [0.011 secs, 2940 KB]
All tests OK.
Your program (‘fence4’) produced all correct answers! This is your
submission #3 for this problem. Congratulations!
程序
1 |
|
后记
本文是百度空间的移植,附:全部USACO题目解答。