之前题目简单总结

上学期在杭电ACM上做了一部分简单题,当时没有博客记录,用记事本简单记了下,现在把它们放在博客上记录一下,方便以后整理:

HDU 2045 关于方格染色的 类似于动态规划 解析:
HDU2045 方格染色

2046 这样的N=50,表示超出了int的范围,所以要用_int64 %d改成%I64d

2050 折线分割平面
分割平面的个数=交点个数+顶点个数+1
令f(n-1)为前n-1条折线分割的平面数,当添加第n条折线时。
因为每一条边与前n-1条折线的两条边都相交,故增加的交点数为2*2*(n-1),顶点增加1,故
f(n)=f(n-1)+4(n-1)+1

2049找新娘 用到了错排公式和组合公式
2049 找新娘

2058 求和 数据量比较大,涉及到了超时问题,需要优化算法。
2058 求和

2065 红色病毒 用到了快速幂算法
2065 红色病毒

2067 小兔的棋盘 如果知道有卡特兰数存在,那就很简单了。就是进栈出栈的排列个数问题 2067 小兔的棋盘
还不如直接用递推的方法做

2095 找不一样的数字,从来没有见过异或运算可以这样用。
2095 找不一样的数字

如何判断两个线段是否相交:

设:线段 a :P1(x1, y1)、P2(x2, y2)  线段 b: Q1(x3, y3)、Q2(x4, y4)

    d1 ====> (P2 - P1) x (Q1 - P1) (叉积)
    d2 ====> (P2 - P1) x (Q2 - P1) (叉积)
    d3 ====> (Q2 - Q1) x (P1 - Q1) (叉积)
    d4 ====> (Q2 - Q1) x (P2 - P1) (叉积)

  首先,先判断端点是否在另一线段上。

  然后,我们只需判断 d1 * d2 < 0 并且 d3 * d4 < 0 便可判断线段相交。
  

#include  
struct node {  
    double x, y;  
}st1, ed1, st2, ed2;  
double get_area(node a0, node a1, node a2) { //求有向面积  
    double s = a0.x*a1.y + a2.x*a0.y +a1.x*a2.y - a2.x*a1.y - a0.x*a2.y - a1.x*a0.y;  
    return s;  
}  
int main() {  
    int n;  
    scanf("%d",&n);  
    while(n--) {  
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&st1.x, &st1.y, &ed1.x, &ed1.y, &st2.x, &st2.y, &ed2.x, &ed2.y);  
        double s1 = get_area(st1, ed1, st2);  
        double s2 = get_area(st1, ed1, ed2);  
        double s3 = get_area(st2, ed2, st1);  
        double s4 = get_area(st2, ed2, ed1);  
        if(s1 * s2 <= 0 && s3 * s4 <= 0)  
            printf("Interseetion\n");  
        else  
            printf("Not Interseetion\n");  
    }  
    return 0;  
}

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