SGOI8之《Darting-Robot》解题报告
   


一、 题意简述:

  本题给出一个置于3维空间中x-z平面上的n边形镖靶(保证原点在n边形内),由顶点和原点的连线将镖靶划分成n个区域各有不同分值。另给出一个目标分值score以及初速度V=100m/s,重力加速度g=,起点坐标(0,3,0),求要正好达到目标分值需要的最少镖数和每一镖的速度方向。

二、 算法分析:

  1. 算法框架:

  读完题目可以很清楚的感觉到本题大致应该分成两部分来解答,即首先计算正好达到目标分值所需的最少镖数,以及求出一种可行的组成方案(每个区域打几镖),然后分别对每个区域确定各镖的落点并计算所需的速度方向。思路明确后就可以各个击破了。

  2. 计算最少镖数:
  这一部分比较简单,用动态规划或广度优先搜索都可以达到目的,这里就不再赘述了,属于基本功啦^_^。

  3. 计算落点和速度方向:

  落点:


  计算落点的方法有很多,选择的标准主要有2点:(1)使各落点分散一些且不要太接近边界,以防由于精度问题导致被误认为落点相同或在边界上;(2)方便直接求若干个不同的落点。只要满足以上2点的方法都可以,并不唯一。

  这里介绍一种方法(也是标程采用的方法):若在当前三角形区域中要打K镖,则将原点所对边(即n边形的边)上的中线的K个K+1等分点作为这K镖的落点。

  速度方向:

  接下来的工作就是计算速度方向,这里物理和几何知识就显得比较重要了,没有什么编程技巧。求速度方向的关键是求出"瞄准"x-z平面上的哪一点(即如果飞镖不受重力加速度影响时会打到的点,我们称其为瞄准点),瞄准点的x坐标即落点的x坐标,z坐标才是真正需要计算的值。

  设落点的坐标为(X,0,Zs),设瞄准点坐标为(X,0,Zx),飞镖飞行的时间为t。要计算瞄准点的坐标,首先,要重新建立一个平面直角坐标系,以抛物线轨迹(即飞镖飞行的轨迹)所在的平面为坐标平面,以起点为新原点,原-y方向为新的+x'方向。设,则在新坐标系内,落点的坐标为(S,Zs),瞄准点为(S,Zx)。联立方程:得: 将已知值代入,求出Zx。下面的工作就比较简单了,将Zx代入①求出t,则所求速度方向为(X/t,-3/t,Zx/t)。

三、 小结:

  表面上,本题似乎很复杂,但经过仔细分析后,解法其实并不难得出且编程的难度也很低。不过有不少选手选择放弃本题……(是没看懂吗?或是来不及做了?),交来的程序得分率也极低,问题主要是集中在精度上,另外还与物理和几何知识的欠缺有关,信息学是一门与许多学科都有交集的综合学科,要想学好信息学,注意与其他学科的互相渗透是十分重要的,所以千万不要忽视课内知识的学习哦^o^!

 

   

 
网站导航 | 关于曙光 | 联系我们 | 请提意见
Copyright © FuJian Sunshine Educational Info. Co.,Ltd.
福建曙光教育资讯有限公司 版权所有