这是一道基础题,在算法上并没有困难的地方,关键是要正确理解题意,抓住问题的本质。
显而易见,站点的设置不超过两个,可以设N个站点不过是题目的障眼法。另外,由于两个村庄人数相等,因此站点的设置就只和距离有关,而和每村人数无关。年份的作用在于判断是平年还是闰年,从而计算出天数,为计算补贴奠定基础。由此,我们可以设计出算法的框架: 计算出n年的总天数days。
计算设置一个站的费用:cost1=days*t*length1*m+p*n
计算设置两个站的费用:cost2=days*t*length2*m+p*2*n
比较cost1和cost2的大小,选取较优的一个输出。
从以上算法框架不难看出,问题的关键在与length1与length2的计算。分别考虑这两种情况:
若只设置一个站点,那么有三种可能:
C、D两点位于直线AB异侧(包括一点在线上),则length1=|CD|,站点设在直线AB与直线CD的交点上;
C、D两点位于直线AB同侧,则length1=|C'D|,C'与C关于直线AB对称,站点设在直线AB与直线C'D的交点上;
A、B、C、D四点共线,则length1=|CD|,站点设在线段CD上的任一点。
若设两个站点,则length2=|CE|+|DF|,E、F分别是C、D在直线AB上的射影。
下面说一说本题所要用到的一些公式:
两点式:已知直线上两点(x1,y1),(x2,y2),则直线方程为
(y1-y2)*x+(x2-x1)*y+x1*y2-x2*y1=0
两点间距离公式:L=sqrt(sqr(x1-x2)+sqr(x2-x2))
已知点(x1,y1),直线Ax+By+C=0,则点到直线距离
d=|Ax1+By1+C|/sqrt(A*A+B*B)
点(x1,y1)关于直线Ax+By+C=0的对称点(x2,y2)为:
x2=((b*b-a*a)*x1-2*a*b*y1-2*a*c))/(a*a+b*b)
y2=((a*a-b*b)*y1-2*a*b*x1-2*b*c))/(a*a+b*b)
直线A1x+B1y+C1=0与直线A2x+B2y+C2=0的交点(x,y)为
x=(c1*b2-b1*c2)/(a1*b2-b1*a2)
y=(a1*c2-c1*a2)/(a1*b2-b1*a2)
有了以上算法与公式,看似颇为繁杂的一道题就被我们解决了。