【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 ...
随机推荐
- 万能的 SQL编程
简介:T-SQL语句创建库.创建表和听.和添加约束等.T-SQL是数据库结构化查询语言,常见的增加.删出.修改.查询.创建库和创建表的语句,还支持定义变量.输出语句.逻辑控制语句(IF.CASE.WH ...
- vijos1907[noip2014]飞扬的小鸟(完全背包)
描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告 ...
- vijos 1512
SuperBrother打鼹鼠 背景 SuperBrother在机房里闲着没事干(再对比一下他的NOIP,真是讽刺啊......),于是便无聊地开始玩“打鼹鼠”...... 描述 在这个“打鼹鼠”的游 ...
- oracle数据库误操作把表删除了,怎样恢复
一:表的恢复 对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的.一般步骤有:1.从flash back里查询被删除的表 select * from re ...
- phantomjs模拟登录
最近在做一些公司其他部门系统的后台模拟操作,但由于那边的系统最开始是外包给其他公司开发的,现在那边的开发也不知道有些post的参数是如何生成的.于是想考察下是不是可以把phantomjs这个工具给加进 ...
- Docker简明教程(以安装wget程序为例)
本文计划: 一.安装Docker(Centos) 二.注册Docker官网帐号 三.下载基础centos镜像,安装需要的软件和环境后,push到自己的repository 一.安装Docker(Cen ...
- oracle 事务总结
用了这么长时间的oracle,该总结一下所得了 1,事务 事务用于保证数据的一致性, 它由一组相关的 dml语句组成, 该组的dml(数据操作语言,增删改,没有查询)语句要么全部成功,要么全部失败,比 ...
- Core Web API上使用Swagger提供API文档
在ASP.NET Core Web API上使用Swagger提供API文档 我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的AP ...
- CGI、FastCGI和PHP-FPM关系图解
CGI.FastCGI和PHP-FPM关系图解 webapp即是php解析器等 当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器.接下 ...
- codevs 1051 接龙游戏
codevs 1051 接龙游戏 http://codevs.cn/problem/1051/ 题目描述 Description 给出了N个单词,已经按长度排好了序.如果某单词i是某单词j的前缀,i- ...