Waterloo Local 2001.09.29 && 2002.01.26 && 2002.07.01

Waterloo local 2001.09.29
  题目分类
 Adventures in Moving - Part IV DP
 Pairsumonious Numbers  搜索
 Snow Clearing  简单题
Stack 'em Up 模拟

Adventures in Moving - Part IV:
这题DP的阶段和决策都非常明显。g[i][j]=min( g[i-1][j+dis[i]-dis[i-1]-buy]+buy*pirce[i] )
g[i][j]表示将要离开第i个加油站时,有j升汽油,所要花费的最少的钱。

Pairsumonious Numbers :
首先 n==3 时很容易求出答案,a1+a2, a1+a3, a2+a3,两两相加再减去另一个
然后 n > 3 时首先我们排序,有顺序就是成功的一半,
如果那 n 个数的大小是 a1 < a2 < a3 < ... < an
那么最小的是  a1+a2, 次小的是 a1+a3,如果我们知道 a2+a3 在哪 那该多好啊
幸运的是 a2+a3只可能出现在第 3 位到第 n 位之间,n又是小于10的数,那我们只要枚举
每种情况就可以了
这样我们就能求出a1 , a2, a3 那对解题有什么用呢?
这时我们把 a1+a2, a1+a3, a2+a3 删掉,剩下的最小的是不是肯定只有 a1+a4,那是不是
a4也求出来了
接着我们把 a1+a4, a2+a4, a3+a4都删掉,剩下最小的不就是 a1+a5了吗
不断进行上述过程就能求出答案
至于有相同元素的时候,很容易就知道也符合上述做法,正因为有相同元素,中间可用multiset
实现上述功能

Snow Clearing:
只需要把每条街加起来再乘以2就是总的距离,除以速度然后化成时间即可!

Stack 'em Up:
这题只要把题意看懂之后,就没问题了。首先给你n种洗牌策略,然后再给你若干个k,在前一次洗好的牌的基础上,按照第k种洗牌策略洗。每洗一次,输出目前的牌的顺序。

Waterloo Local 2002.01.26
题目分类 
   
Discrete Logging    求离散对数
Hardwood Species  简单题
Forests
水题(stl运用)
A Star not a Tree? 牛顿迭代法


Discrete Logging :
求以b为基模于n的离散对数我们有O(n^0.5*logn)的算法
有兴趣者可查看Shank's Baby-Step-Gaint-Step Algorithm



A Star not a Tree? :
给你平面上 n ( n < 100)个点, 要求一个点p,使得 p 到各个点的距离之和最小
用牛顿迭代,能证明x,y偏导为0时,有最小值,但我不会证 回去学高数
既然知道方程x,y偏导为0时有最小值,那就好办了,取平均值为初值,然后不断迭代,
但我精度调到 1e-4 才能过,这样我的迭代跑了300ms,别人都跑0ms,总感觉有问题
贴出迭代代码,希望大家给我指正

  while ! ( zero(x1  -  x0)  &&  zero(y1  -  y0) ) )
         { 
             x0
= x1, y0 = y1;
             
for ( fx = 0 , i = 0 ; i  <  n; i ++ )
                 fx
+=  (x0  -  p[i][ 0 ]) /  sqrt( (x0  -  p[i][ 0 ]) * (x0  -  p[i][ 0 ])  +  (y0  -  p[i][ 1 ]) * (y0  -  p[i][ 1 ]) );
             
for (fxx = 0 , i  = 0 ; i  <  n; i ++ )
                 fxx
+= 2 * (x0  -  p[i][ 0 ]) * (x0  -  p[i][ 0 ])  +  (y0  -  p[i][ 1 ]) * (y0  -  p[i][ 1 ]) )  /  ( (x0  -  p[i][ 0 ]) * (x0  -  p[i][ 0 ])  +  (y0  -  p[i][ 1 ]) * (y0  -  p[i][ 1 ]) );
             x1 
=  x0  -  fx / fxx;
             
for (fy = 0 , i = 0 ; i  <  n; i ++ )
                 fy
+= (y0  -  p[i][ 1 ]) /  sqrt( (x0  -  p[i][ 0 ]) * (x0  -  p[i][ 0 ])  +  (y0  -  p[i][ 1 ]) * (y0  -  p[i][ 1 ]) );
             
for (fyy = 0 , i = 0 ; i  <  n; i ++ )
                 fyy
+= ( (x0  -  p[i][ 0 ]) * (x0  -  p[i][ 0 ])  +   2 * (y0  -  p[i][ 1 ]) * (y0  -  p[i][ 1 ]) )  /  ( (x0  -  p[i][ 0 ]) * (x0  -  p[i][ 0 ])  +  (y0  -  p[i][ 1 ]) * (y0  -  p[i][ 1 ]) );
             y1
= y0  -  fy / fyy;
         }





Waterloo local 2002.07.01


题目分类
 Hay Points  简单题
 Jogging Trails  图论,中国邮路问题
 Beavergnaw  简单题
 Power Strings  水题
Relatives
欧拉函数
Jogging Trails:
题目意思是给定一些点,然后一些边,并且两个点之间可能有多条边,问从一个点出发,遍历完所有的边至少一次且最后在回到出发点需要走的最少距离!
如果这个图是欧拉图,那么距离就是边之和,一个图存在欧拉图的充要条件是每个定点的度为偶数!
但是如果不是欧拉图,那么我们就要把这个图变成欧拉图,只需要添加一些边,顶点的度全部为偶数就好了,因为一个图中奇数度顶点一定有偶数个!所以只要枚举这样的奇数度顶点,添加边使其度为偶数,很明显添加的边不会影响其他偶数度顶点的奇偶性!并且由于要距离最小,所以添加的边一定是这两个顶点的最短距离!这一步可以用记忆化搜索实现!


欧拉函数的一些题目(
http://hi.baidu.com/wuxyy/blog/item/33957f1ee03a1cf51bd5761d.html

欧拉函数入门题目:poj3090 Visible Lattice Points  poj2407 Relatives
poj2478 Farey Sequence
欧拉函数高级应用:poj2480 Longge's problem  poj1091 跳蚤

跳蚤题目很有意思,推荐


你可能感兴趣的:(Waterloo Local 2001.09.29 && 2002.01.26 && 2002.07.01)