poj1039 计算几何-交点,叉积

http://poj.org/problem?id=1039
题意:给出一个曲折的管道,求出光线能够到达的管道的最远点的横坐标。
思路:能够到达最远点的直线必然通过管道的一个上管道壁的折点和一个下管道壁的折点,枚举所有的这样的折点,求出最远能够到达的地方的横坐标。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int n;
double maxx= -(1<<30);
const int maxn = 1e6+10;
const double precision = 1e-3;
const double inf = (1<<30);
struct point{
    double x;
    double y;
}up[maxn],down[maxn];
int dblcmp(double p){
    if(fabs(p)<precision)
        return 0;
    return p>0?1:-1;
}
double det(double x1,double y1,double x2,double y2){
    return x1*y2-x2*y1;
}
double cross(point A,point B,point P){
    return det(B.x-A.x , B.y-A.y , P.x-A.x , P.y-A.y);
}
bool segcross(point A,point B,point C,point D){
    return (dblcmp(cross(A,B,C)) * dblcmp(cross(A,B,D)) <= 0);
}
double intersection(point A,point B,point C,point D){
    double area1=cross(A,B,C);
    double area2=cross(A,B,D);
    int c=dblcmp(area1);
    int d=dblcmp(area2);

    if(c*d<0)
        return (area2*C.x - area1*D.x)/(area2-area1);
    if(c*d==0)
        if(c==0)
            return C.x;
        else
            return D.x;

    return -inf;
}
void init(){
    maxx = -(1<<30);
    for(int i = 1;i <= n;i++){
            scanf("%lf%lf",&up[i].x,&up[i].y);
            down[i].x=up[i].x;
            down[i].y=up[i].y-1;
    }
}
void sov(){
    bool flag=false;
    int k;
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= n;j++)
            if(i!=j){
                    for(k=1; k <= n;k++)
                        if(!segcross(up[i],down[j],up[k],down[k]))
                            break;
                    if(k > n){
                        flag=true;
                        break;
                    }
                    else{
                        if(k < max(i,j))    continue;
                        double temp1=intersection(up[i],down[j],up[k],up[k-1]),temp2 = intersection(up[i],down[j],down[k],down[k-1]);
                        maxx = max(max(temp1,maxx),temp2);
                    }
                }

            if(flag)
                break;
        }
        if(flag)
            printf("Through all the pipe.\n");
        else{
            printf("%.2f\n",maxx);
        }
}

int main(){
    while(~scanf("%d",&n)&&n){
        init();
        sov();
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值