【POJ 2826】An Easy Problem?!(几何、线段)
两个木条装雨水能装多少。
两线段相交,且不遮盖的情况下才可能装到水。
求出交点,再取两线段的较高端点的较小值h,(h-交点的y)为三角形的高。
三角形的宽即为(h带入两条线段所在直线得到的横坐标的差值)。
三角形的面积即为雨水的量。
坑点:如果用G++提交,ans要加上eps才能过,c++提交则没问题。
#include <iostream>
#include <cmath>
#include <cstdio>
#define MAX 1<<31
#define dd double
using namespace std;
struct P {dd x,y;};
struct L{
P s,e;
void input(){
scanf("%lf%lf%lf%lf",&s.x,&s.y,&e.x,&e.y);
if(s.x>e.x)swap(s,e);
}
dd k(){//斜率
if(s.x==e.x)return MAX;
return (s.y-e.y)/(s.x-e.x);
}
dd highX(){//较高端点的x值
if(s.y>e.y)return s.x;
return e.x;
}
}a,b;
dd xmult(P a,P b,P o){//叉积
return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);
}
bool isCross(L a,L b){//是否相交
return xmult(a.s,a.e,b.s)*xmult(a.s,a.e,b.e)<=;//取等号就包括端点在另一线段的情况
}
P getCross(L a,L b){
P c;
dd ka=a.k(),kb=b.k();
if(ka==MAX){//a是竖直的
c.x=a.s.x;
c.y=(c.x-b.s.x)*kb+b.s.y;
}
else{
if(kb==MAX)
c.x=b.s.x;
else
c.x=(a.s.y-b.s.y-ka*a.s.x+kb*b.s.x)/(kb-ka);
c.y=(c.x-a.s.x)*ka+a.s.y;
}
return c;
}
dd getx(L a,dd y){//a所在直线上纵坐标为y的点的x
if(a.s.y==a.e.y)return a.s.x;
return (y-a.s.y)*(a.s.x-a.e.x)/(a.s.y-a.e.y)+a.s.x;
}
bool shadow(L a,L b){//是否遮盖
dd x1=a.highX(),x2=b.highX();
//如果倾斜方向一样,k大的线段的较高端点的x也更大则遮盖了
//并且斜率相同的线段也会返回true
return a.k()*b.k()>&&(a.k()-b.k())*(x1-x2)>=;
}
void solve(){
double ans=;
if(a.k()&&b.k()&&isCross(a,b)&&isCross(b,a)&&!shadow(a,b)){
P c=getCross(a,b);
dd h=min(max(a.s.y,a.e.y),max(b.s.y,b.e.y));
dd w=fabs(getx(a,h)-getx(b,h));
ans=(h-c.y)*w/2.0;
}
printf("%.2f\n",ans);
}
int main() {
int t;
cin>>t;
while(t--){
a.input();
b.input();
solve();
}
}
【POJ 2826】An Easy Problem?!(几何、线段)的更多相关文章
- POJ 2826 An Easy Problem? 判断线段相交
POJ 2826 An Easy Problem?! -- 思路来自kuangbin博客 下面三种情况比较特殊,特别是第三种 G++怎么交都是WA,同样的代码C++A了 #include <io ...
- POJ 2826 An Easy Problem?!(线段交点+简单计算)
Description It's raining outside. Farmer Johnson's bull Ben wants some rain to water his flowers. Be ...
- POJ 2826 An Easy Problem?![线段]
An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12970 Accepted: 199 ...
- POJ 2826 An Easy Problem?!
An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7837 Accepted: 1145 ...
- 简单几何(线段相交) POJ 2826 An Easy Problem?!
题目传送门 题意:两条线段看成两块木板,雨水从上方往下垂直落下,问能接受到的水的体积 分析:恶心的分类讨论题,考虑各种情况,尤其是入口被堵住的情况,我的方法是先判断最高的两个点是否在交点的同一侧,然后 ...
- POJ 2826 An Easy Problem?! 好的标题
受该两块木板以形成槽的效果.Q槽可容纳雨水多,注意雨爆跌,思想是非常easy,分类讨论是有点差. 1.假定两条线段不相交或平行,然后再装0: 2.有一个平行x轴.连衣裙0. 3.若上面覆盖以下的,装0 ...
- POJ 2826 An Easy Problem?! --计算几何,叉积
题意: 在墙上钉两块木板,问能装多少水.即两条线段所夹的中间开口向上的面积(到短板的水平线截止) 解法: 如图: 先看是否相交,不相交肯定不行,然后就要求出P与A,B / C,D中谁形成的向量是指向上 ...
- POJ 2826 An Easy Problem!(简单数论)
Description Have you heard the fact "The base of every normal number system is 10" ? Of co ...
- POJ 1152 An Easy Problem! (取模运算性质)
题目链接:POJ 1152 An Easy Problem! 题意:求一个N进制的数R.保证R能被(N-1)整除时最小的N. 第一反应是暴力.N的大小0到62.发现当中将N进制话成10进制时,数据会溢 ...
- [POJ] 2453 An Easy Problem [位运算]
An Easy Problem Description As we known, data stored in the computers is in binary form. The probl ...
随机推荐
- 如何定位web前后台的BUG
一.对系统整体的了解 Server端:jsp+Servlet+json 数据库:sql.MySQL.oracle等 前台: 涉及到 jstl,jsp,js,css,htm等方面 后台:servlet, ...
- C# 断点续传原理与实现
在了解HTTP断点续传的原理之前,让我们先来了解一下HTTP协议,HTTP协议是一种基于tcp的简单协议,分为请求和回复两种.请求协议是由 客户机(浏览器)向服务器(WEB SERVER)提交请求时发 ...
- poj3270
Cow Sorting Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6750 Accepted: 2633 Descr ...
- 043医疗项目-模块四:采购单模块—采购单明细查询(Dao,Service,Action三层)
前一篇文章我们做的是在医院的角度上添加在采购单里面添加药品.这一篇文章是查看我们添加的采购单信息. 我们先看一下要实现的效果:当: 按下确认添加时,会在这里 显示出刚才添加的数据. 好,我们就来做这个 ...
- Codevs 1229 数字游戏
1229 数字游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description Lele 最近上课的时候都很无聊,所以他发明了 ...
- CLR Table-Valued函数
这几天来,努力学习了CLR的存储过程,创建与部署.从普通的存储过程,带参数,以及Output返回值等. Insus.NET今天学习一个例子,怎样实现CLR Table-Valued函数.在数据库中,我 ...
- CefSharp的引用、配置、实例
CefSharp的引用.配置.实例与报错排除(源码) Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfro ...
- nginx架构
nginx平台初探(100%)
- scala 学习笔记(03) 参数缺省值、不定个数参数、类的属性(Property)、泛型初步
继续学习,这一篇主要是通过scala来吐槽java的,同样是jvm上的语言,差距咋就这么大呢? 作为一个有.NET开发经验的程序员,当初刚接触java时,相信很多人对java语言有以下不爽(只列了极小 ...
- 别再迷信 zepto 了
希望网上公开课的老师们不要再讲移动端网页用zepto了,坑了无数鸟啊 ~~~. 1.自己/公司/项目组所写和所积累(网上下的)的js函数都是以jQuery插件的写法来写的,如果要换到zepto上的话那 ...