poj 1039-Pipe解题报告

链接:http://poj.org/problem?id=1039

这题的题意是一个通光的管道,假设这种材质不反射光,求从入口任意方向进入的光所能达到的最大的横坐标大小,如果有光能够完全通过管道则输出Through all the pipe.否则输出最大的横坐标值,可以证明的是,最长距离的光一定是经过某两个顶点的,假设有有一条光线不经过顶点,那么通过平移,旋转到顶点上之后所能得到的值一定比原来的要大,所以可以枚举每两个顶点的直线,从左到右依次判断是否在拐点的内部,如果不在说明和前一个拐点所购成了两个线段之间有一条是相交的,那么交点就是最大值

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #define N 21
 6 #define eps 1e-5
 7 #define left -10e8
 8 using namespace std;

 9 struct point
10 {
11     double x,y;
12 };
13 point up[N],down[N];
14 int n;
15 double getx(point p1,point p2,point p3,point p4)//找到直线和线段相交的横坐标
16 {
17     double k1=(p2.y-p1.y)/(p2.x-p1.x);
18     double k2=(p4.y-p3.y)/(p4.x-p3.x);
19     double b1=p2.y-k1*p2.x;
20     double b2=p3.y-k2*p3.x;
21     return (b2-b1)/(k1-k2);
22 }
23 double getans()
24 {
25     int i,j,k;
26     double ans=left,right;
27     double tx,ty;
28     point ql,qr,pl,pr;
29     for(i=0;i<n;i++)
30     for(j=0;j<n;j++)
31     {
32         if(i==j)
33         continue;
34         ql=up[i];
35         qr=down[j];
36         right=left;
37         for(k=0;k<n;k++)
38         {
39             tx=up[k].x;
40             ty=(tx-ql.x)*(qr.y-ql.y)/(qr.x-ql.x)+ql.y;
41             if(ty>down[k].y&&ty<up[k].y||fabs(ty-down[k].y)<eps||fabs(ty-up[k].y)<eps)
42             right=tx;
43             else
44             {
45                 if(k)
46                 {
47                     if(ty<down[k].y)
48                     right=getx(ql,qr,down[k-1],down[k]);
49                     else
50                     right=getx(ql,qr,up[k-1],up[k]);
51                 }
52                 break;
53             }
54         }
55         if(right>ans)
56             ans=right;
57     }
58     return ans;
59 }
60 int main()
61 {
62     int i,j,k;
63     while(scanf("%d",&n)&&n)
64     {
65         for(i=0;i<n;i++)
66         {
67             scanf("%lf%lf",&up[i].x,&up[i].y);
68             down[i]=up[i];
69             down[i].y-=1.0;
70         }
71         double ans=getans();
72         if(ans>up[n-1].x||fabs(ans-up[n-1].x)<eps)
73         printf("Through all the pipe.\n");
74         else
75         printf("%.2lf\n",ans);
76     }
77     return 0;
78 }

 

转载于:https://www.cnblogs.com/caozhenhai/archive/2012/05/05/2484754.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
疫情居家办公系统管理系统按照操作主体分为管理员和用户。管理员的功能包括办公设备管理、部门信息管理、字典管理、公告信息管理、请假信息管理、签到信息管理、留言管理、外出报备管理、薪资管理、用户管理、公司资料管理、管理员管理。用户的功能等。该系统采用了MySQL数据库,Java语言,Spring Boot框架等技术进行编程实现。 疫情居家办公系统管理系统可以提高疫情居家办公系统信息管理问题的解决效率,优化疫情居家办公系统信息处理流程,保证疫情居家办公系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理疫情居家办公系统信息,包括外出报备管理,培训管理,签到管理,薪资管理等,可以管理公告。 外出报备管理界面,管理员在外出报备管理界面中可以对界面中显示,可以对外出报备信息的外出报备状态进行查看,可以添加新的外出报备信息等。签到管理界面,管理员在签到管理界面中查看签到种类信息,签到描述信息,新增签到信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值