题目链接:点击查看

题目大意:给出两条线段,问组成的容器最多能接多少雨水

题目分析:既然是接雨水,那么肯定只能是漏斗状,很容易排除掉两种情况:

  1. 其中有一条线段平行于x轴
  2. 两条线段不相交

还有一种比较难想的情况kuangbin大神提到了,那就是封口的情况,对应就是以下三种情况:

单独讨论之后,剩下的情况就一定有解了,直接按照三角形的面积计算就是答案了

注意结果需要加上一个eps防止出现-0.00的情况,我猜的,不加的话会WA,加上就A了,玄学

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=60;const double eps = 1e-8;int sgn(double x){if(fabs(x) < eps)return 0;if(x < 0)return -1;else return 1;
}struct Point{double x,y;Point(){}Point(double _x,double _y){x = _x;y = _y;}void input(){scanf("%lf%lf",&x,&y);}Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}//叉积double operator ^(const Point &b)const{return x*b.y - y*b.x;}//点积double operator *(const Point &b)const{return x*b.x + y*b.y;}//返回两点的距离double distance(Point p){return hypot(x-p.x,y-p.y);}
};struct Line{Point s,e;Line(){}Line(Point _s,Point _e){s = _s;e = _e;}void input(){s.input();e.input();}//求线段长度double length(){return s.distance(e);}//`两线段相交判断`//`2 规范相交`//`1 非规范相交`//`0 不相交`int segcrossseg(Line v){int d1 = sgn((e-s)^(v.s-s));int d2 = sgn((e-s)^(v.e-s));int d3 = sgn((v.e-v.s)^(s-v.s));int d4 = sgn((v.e-v.s)^(e-v.s));if( (d1^d2)==-2 && (d3^d4)==-2 )return 2;return (d1==0 && sgn((v.s-s)*(v.s-e))<=0) ||(d2==0 && sgn((v.e-s)*(v.e-e))<=0) ||(d3==0 && sgn((s-v.s)*(s-v.e))<=0) ||(d4==0 && sgn((e-v.s)*(e-v.e))<=0);}//`直线和线段相交判断`//`-*this line   -v seg`//`2 规范相交`//`1 非规范相交`//`0 不相交`int linecrossseg(Line v){int d1 = sgn((e-s)^(v.s-s));int d2 = sgn((e-s)^(v.e-s));if((d1^d2)==-2) return 2;return (d1==0||d2==0);}//`求两直线的交点`//`要保证两直线不平行或重合`Point crosspoint(Line v){double a1 = (v.e-v.s)^(s-v.s);double a2 = (v.e-v.s)^(e-v.s);return Point((s.x*a2-e.x*a1)/(a2-a1),(s.y*a2-e.y*a1)/(a2-a1));}//点到直线的距离double dispointtoline(Point p){return fabs((p-s)^(e-s))/length();}
}l1,l2;int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){l1.input();l2.input();if(sgn(l1.s.y-l1.e.y)==0||sgn(l2.s.y-l2.e.y)==0)//有一条线平行于x轴 {puts("0.00");continue;}if(sgn(l1.s.y-l1.e.y)<0)swap(l1.s,l1.e);if(sgn(l2.s.y-l2.e.y)<0)swap(l2.s,l2.e);if(l1.segcrossseg(l2)==0)//不相交 {puts("0.00");continue;}if(l1.segcrossseg(Line(Point(l2.s.x,100000),l2.s))||l2.segcrossseg(Line(Point(l1.s.x,100000),l1.s)))//口被封上 {puts("0.00");continue;}double ans1=1e10,ans2=1e10;Point point=l1.crosspoint(l2);//交点Line temp1=Line(l2.s,Point(100000,l2.s.y));//与x轴平行,且过l2上面的点的直线 Line temp2=Line(l1.s,Point(100000,l1.s.y));//与x轴平行,且过l1上面的点的直线 if(temp1.linecrossseg(l1)){Point temp=temp1.crosspoint(l1);//当前三个点构成三角形temp point l2.s ans1=0.5*(temp1.dispointtoline(point)*temp.distance(l2.s));}if(temp2.linecrossseg(l2)){Point temp=temp2.crosspoint(l2);//当前三个点构成三角形temp point l1.s ans2=0.5*(temp2.dispointtoline(point)*temp.distance(l1.s));}printf("%.2f\n",min(ans1,ans2)+eps);}return 0;
}

POJ - 2826 An Easy Problem?!(计算几何,好题)相关推荐

  1. POJ 2826 An Easy Problem?! 叉积求多边形面积 【计算几何】

    ACM博客_kuangbin POJ 2826 An Easy Problem?! An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536 ...

  2. poj 1872 A Dicey Problem (bfs+WordFinal题)

    居然是一道WF题,虽然是很早的,但也超有成就感啊!! 4维判重,分别是x,y坐标和骰子上面和骰子前面的号码. 很水,拿个骰子或者纸盒比划下就好了. #include<cstdio> #in ...

  3. 留着以后慢慢做的计算几何(题表)

    写在前面 最近对计算几何有点感兴趣,所以在网上找了一些不错的博客和不错的题,留着以后一边做一边学. 这些题也会慢慢出现在我的博客里... 以下为转载 计算几何题的特点与做题要领: 1.大部分不会很难, ...

  4. 数论六之计算几何——An Easy Problem,Ancient Berland Circus,Open-air shopping malls

    可检验模板正确度 An Easy Problem?! Ancient Berland Circus Open-air shopping malls An Easy Problem?! problem ...

  5. 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)

    [线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...

  6. poj 3590 The shuffle Problem(置换群+DP)

    题目链接:poj 3590 The shuffle Problem 题意: 给你一个数n,让你找一个字典序最小的置换序列,使得变换整个周期最大. 题解: 由于置换群的性质,我们可以将n拆分成m个数,使 ...

  7. 2019年ICPC银川区域赛 Easy Problem(简单莫比乌斯函数 + 欧拉降幂)

    Easy Problem ∑a1=1m∑a2=1m∑a3=1m⋯∑an−1m∑anm[gcd(a1,a2,a3,-,an−1,an)==d](a1,a2,a3,-,an−1,an)k=dkd∑a1=1 ...

  8. Problem D: 编程题B-向量的数量积

    Problem D: 编程题B-向量的数量积 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 164  Solved: 148 Description ...

  9. 信息学奥赛一本通 1223:An Easy Problem | OpenJudge NOI 4.6 1455:An Easy Problem

    [题目链接] ybt 1223:An Easy Problem OpenJudge NOI 4.6 1455:An Easy Problem [题目考点] 1. 数制 2. 枚举 [解题思路] 解法1 ...

最新文章

  1. OpenCV代码提取:transpose函数的实现
  2. python批量下载文件只有1kb_Python 实现批量从不同的Linux服务器下载文件
  3. linux中mbr最大多少分区,Linux与磁盘分区介绍(MBR,GPT)
  4. sql语句(Oracle和sqlserver)
  5. foreman源NO_PUBKEY 6F8600B9563278F6
  6. uniapp点击图片放大_想要放大镜将图片放大的效果?你只需这么做即可!
  7. Android 百度地图-实现POI的搜索(搜索周边)附源码
  8. Hibernate基本概念 (2)
  9. python自动化工具哪个好用_10款好用的自动化测试工具推荐
  10. 信息学奥赛C++语言:某年某月天数
  11. Java EE互联网轻量级框架整合开发
  12. 方法的重载和重写的区别
  13. NAT64 Technology: Connecting IPv6 and IPv4 Networks
  14. 好听的计算机音乐大全,抖音里面的歌曲大全:100首超级好听的抖音歌曲(推荐)...
  15. 关于软件开发中遇到的问题解决思路
  16. 卸载rasing,瑞星
  17. hp打印机计算机接口,hp打印机的端口怎么设置?各是什么意思?
  18. Google Scholar特别好用的镜像网站链接
  19. Mysql 增量备份和全量备份
  20. 211工科计算机专业大学排名,这所211大学曾痛失985资格,工科专业实力强劲

热门文章

  1. 两线怎么接三线插座图_水温传感器怎么判断好坏
  2. 搭建K8s集群(平台规划和部署方式介绍)
  3. RabbitMQ交换机简介
  4. 内存泄漏与内存溢出的区别
  5. es6语法-let定义变量和常量
  6. 适配器模式coding
  7. mycat配置访问oracle_教程 | MySql都会了,确定不学习一下MyCat分片?
  8. 请问在allegro中如何在铜箔上单独放置过孔?
  9. 分析工厂模式中的问题并改造
  10. P1312 Mayan游戏 [模拟][搜索]