usaco3.4

3.4.1 closed fence

 考计算几何,熟悉公式之后只要发现,任意一条可见的边都可以通过向端点发射一条射线(偏转一个小角度)就可以找到,角度计算用atan2(y,x),第一次用这个函数,好爽啊(以后不用手算了.....囧)不过要注意传递参数的顺序,一些公式的来历和解释在这里

 

3.4.2 American heritage

 考察2叉树各种遍历间的转换,注意到3种遍历,左右子树和根节点的顺序关系

L root R

root L R

L R root

(它们叫神马名字我忘了.....usaco3.4)

于是知道2个序列分别是哪种遍历后就可以确定root的位置,然后把原来的序列分成左子树和右子树相同遍历的序列,递归求解子问题,再注意好参数传递的问题,就可以顺利解决了。

 

3.4.3 Electric fence

 考察皮克定律:一个多边形的顶点在格点上,则他的面积可以表示为S=A+B/2 -1; A代表多边形内部的格点,B代表边界上的格点。

 网上查了皮克定律的证明,没有满意的结果,有个归纳法证明,先证明矩形满足,再证明直角三角形满足,再证明“若S满足,与s2组成S的s1满足,则s2也满足(貌似如此哈...可能有误)”,这个证明还是比较有说服力,但是过于形式化,是从结论出发反推回去找到的证明,失去了对问题本质的描述,没有启发性。。。。。。

另一个印象比较深刻的是把问题化作热量传递的物理模型,然后用物理规律给出一种解释(应该还不能算作证明把),虽然形象,但不够严谨.

 3.4.3也有其他解法:作2条直线,求他们内部的格子数。为简化思路,把xy轴反转,得到更加“统一”的2条直线,根据他们的方程,在每个x处统计。

 

3.4.4 Raucous rockers

 多维背包问题,每个维度初始化为上一个维度的统计结果,就可以化简为一个简单的1维01背包.

 定义f[x][y][z]为 用x张CD 考虑前y首歌 剩余时间为z

 for(x=1 to m)

 for(y=1 to n)

 for(z=0 to t)

{

 f[x][y][z]=f[x-1][y][t];

 f[x][y][z]=max(f[x][y][z],f[x][y-1][z]);

 if(z>=time[y])

 f[x][y][z]=max(f[x][y][z],f[x][y-1][z-time[y]]+1);

}

 

 这一节题目都不难,主要出现了一些新知识点和新题型。

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

你可能感兴趣的:(USACO)