3.4 计算几何

nocow中文版

mostly based on only two operations described below: cross product and arctangent.

| i j k |
| ux uy uz |
| vx vy vz |
(uyvz-vyu z)i + (uzvx-u xvz)j + (uxv y-uyvx)k 


- atan2, takes two arguments: a DELTA y value and a DELTA x value (in that order!).

1 知识准备
2 操作
2.1 叉积
2.2 点积
2.3 反正切
3 全面考虑问题
4 计算几何算法
4.1 三角形面积
4.2 两条线段平行吗?
4.3 多边形面积
4.4 点到直线的距离
4.5 点在直线上
4.6 点都在直线的同侧
4.7 点在线段上
4.8 点在三角形内
4.9 点在凸多边形内
4.10 四点(或更多)共面
4.11 两条直线相交
4.12 两条线段相交
4.13 两直线的交点
4.14 判断平面内多边形的凹凸性
4.15 点在凹多边形内
5 几何方法
5.1 蒙特卡洛方法(Monte Carlo)
5.2 分割技术
5.3 转化为图
6 例子
6.1 Point Moving
6.2 Bicycle Routing
6.3 Maximizing Line Intersections
6.4 Polygon Classification

heritage

给出中序表达式和先序表达式求后序

后序是一个栈的思想,遍历先序,找到对应中序位置,比栈顶大时输出栈顶元素,然后入栈,

采取递归的方法建立二叉树。首先取前序遍历的首元素当作二叉树的根,当前元素为根。把前序遍历中的当前元素当作中序遍历的分割点,中序遍历分割点前面的元素一定在当前元素的左子树,分割点后面元素一定在当前元素的右子树。然后加入下一个顶点,再把它当作分割点。如此递归的进行,直到二叉树建立完成。

//我的
for (int i = 0; i < inorder.length(); i++)
    {
        for (int j = 0; j < preorder.length(); j++)
        {
            if (inorder[i] == preorder[j])
            {
                while (st.size() && j < st.top()) {
                    fout << preorder[st.top()];
                    st.pop();
                }
                st.push(j);
            }
        }
    }
    while (st.size()) {
        fout << preorder[st.top()];
        st.pop();
    }


//NOCOW
void makenode(int beg,int end)
{

    if(beg>end) return; 
    for(int i=beg;i<=end;i++)
        if(s1[i]==s2[k])
        {       
            k++;
            makenode(beg,i-1);
            makenode(i+1,end);
            fout<<s1[i];
            return;
        }
}

fence9

求三角形格点数
O(n)扫一遍,谜一样的精度…提交了六次……

nocow真是涨知识的地方…

  • 皮克定理:
    给定顶点坐标均是整点(或正方形格点)的简单多边形,皮克定理说明了其面积A和内部格点数目i、边上格点数目b的关系
    A = i + b/2 - 1
    与欧拉公式等价V-E+F=2
    一条直线((0,0),(n,m))上的格点数等于n与m的最大公约数+1
    ((p*m)/2)+1-(((gcd(n,m)+1)+(gcd(abs(n-p),m)+1)+p-2)/2)

  • 二分向量法
    二分y坐标即可刚开始的区间是(0,M),每次对比(x,y)和(n,m)的叉积(即求的相对方位),如果(x,y)在(n,m)的上方,那么向下二分,否则向上二分,最后的结果是y值最接近向量(n,m)的点,求出这个点就可以知道从这个点到0有几个点
    从源点(0,0)到(x,i)向量(x-0,i-0)与(n-0,m-0)的叉积应该大于0 二、点(n,m)到点(x,i)组成的向量(n-x,m-i)与点(n,m)到点(p,0)组成的向量(n-p,m-0)的叉积应该大于0

唱片分布 Rockers

一开始写DP越写越复杂,,最后dfs居然直接0s过了……

官方dp

dp[a][b][c] being the most number of songs that we can put on the first ‘a’ CDs, with ‘b’ minutes already used up on the ‘a’th CD, and with ‘c’ being the last song that we put on CD ‘a’.

果然是状态猜错了QAQ
主要是一直没有确认,只有最后一张光盘剩余时间有意义.
搞清楚后爆搜就过了
(加了一个简单的剪枝if (n - pos + mus > cnt))

估计主要是数据量太小,怎么做都能过吧…
而且我的dfs居然比一些题解中的..要快…
下面是NOCOW里面的动归套路

f[i,j]表示1~i物品,使用空间量<=j分钟的最大答案
f[i,j]=max{f[i-1,j], f[i-1,get(a[i],j)]+1};
然后压成1维,a不用记录在数组中
f[j]=max{f[j],f[get(a,j)]+1};

F[I,J]代表前I个歌曲装在J个唱片的最优值,所以
F[I,J]:=Max{F[K,J]+Maxit[K+1,I]}

这一节内容好少..一天就做完了
估计是把相对难一点的题目放到后面章节去了吧

五月底4+2选拔赛,想要好好准备一下.
但是最近给自己花样越来越多,
甚至还开始玩游戏了…
保持脑力继续向前吧.
这周(或许可以)先把离散教材的计数原理和概率刷完
21#百度之星
27#4+2选拔赛,争取把借来的算法书看一遍.
yeap~

谢谢昨夜学术群大家的刷屏…
我可要加倍努力
才可能达到大神的水准吧

哈哈哈贻笑大方~

Chapter 1 DONE 2016.03.21 Getting started
Chapter 2 DONE 2016.03.23 Bigger Challenges
Chapter 3 DONE 2016.05.17 Techniques more subtle

你可能感兴趣的:(算法)