Waterloo local 2000.01.29

Waterloo local 2000.01.29
  题目分类
 Y2K Accounting Bug  最优局面(math)
 Airline Hub  球面距离(geometry)
 Snakes  图论,联通性
Snap 模拟
Steps 分析 (math)

 Y2K Accounting Bug :
一年12个月中任意连续的5个月都是赤字,每月要么盈利 s ,要么亏蚀 d, 求这一年可能的最大盈利

对于一个给定的 s 和 d,我们只要让亏损的月份尽量少,而实际上存在固定的最优局面
分类讨论每种情况的最优局面, 一共有五种(O表示亏  。表示盈)
。。。。O亏,则 。。。。O。。O。。。。为最优局面
。。。OO亏,则 。。。OO。。OO。。。为最优局面
。。OOO亏,则 。。OOO。。OOO。。为最优局面
。OOOO亏,则 。OOOOO。OOOO。为最优局面
OOOOO亏, 必亏
 



Airline Hub :
0ms的不知道怎么做的,我是暴力做法500ms
这里只提一下球面距的求解方法, 先将经纬度化成角度,再把角度化成直角坐标,用余弦公式计算两半径夹角q, 再求出弧长 l = r*q;
在计算角度时, 中间过程既乘了 r^2 又 除了 r^2所以约去了

附上代码
 1  double  dis( double  la1,  double  lo1,  double  la2,  double  lo2,  double  r)
 2  // la1 lo1为第一个点的纬度,经度
 3  {
 4      point p[ 2 ];
 5       double  ang[ 2 ][ 2 ];
 6       double  la[ 2 ] = {la1, la2}, lo[ 2 ] = {lo1, lo2};
 7       int  i;
 8       for (i  =   0 ;  i  <    2 ; i ++ )
 9      {
10          ang[i][ 0 ] = la[i] / 180 * pi;
11          ang[i][ 1 ] = lo[i] / 180 * pi;
12          p[i].z = sin(ang[i][ 0 ]);                       //本应该乘于r
13          p[i].x = cos(ang[i][ 0 ]) * cos(ang[i][ 1 ]);
14          p[i].y = cos(ang[i][ 0 ]) * sin(ang[i][ 1 ]); 
15      }
16       return  r  *  acos(p[ 0 ].x * p[ 1 ].x + p[ 0 ].y * p[ 1 ].y + p[ 0 ].z * p[ 1 ].z); //本应该除于r*r
17  }
18 


Snakes:
题目意思就不说了,这里主要说一下做法!
我们把蛇连同它的攻击范围看做一个圆,再把圆抽象成一个点!点与点之间有边连接仅当两个点代表的圆有公共面积!然后我们在把上边界和下边界各抽象成一个点(S和T),同样上边界与点之间有边连接仅当点代表的圆与上边界相交,同理,可得下边界与点之间的边关系!
这样处理以后如果有从左到右的路径,当且仅当不存在S到T通路!只要深搜或者广搜即可!但是题目还要我们求出左右的坐标,只需确定纵坐标即可,而且纵坐标要最大!所以我们考虑与S连通的每一个点,如果该点代表的圆与左边界有交点,那么如果从这个交点上面走一定走不过去,所以我们更新左边的纵坐标到这个交点处,对所有的圆都这样处理,即可确定左边纵坐标,右边的同理可求!而且这一步可以在求连通的时候随便求出,我们只需从S出发,一直搜即可!

Snap:
按照题意模拟(随机数取 rand()/99%2)。注意赢来的牌是加在上面,不是加在下面的。
 
Steps :
 这里首先能发现 加速的次数 == 减速的次数,也就是说如果不考虑匀速部分,并且最大速度为n,可以算出这种情况下能走的距离 s = n^2;
再考虑匀速部分, 设dis为要求两点距离
显然我需要找到一个n满足 n*n<= dis < (n+1)*(n+1),最大速度一定为 n ,多余的部分即 leave = dis - n*n;
leave /n 部分用最大速度匀速跑,leave % n 部分之需要中途匀速一秒就好


你可能感兴趣的:(Waterloo local 2000.01.29)