转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove

题目:从0,0出发,走到某一点,会告诉你目标点是更近了还是更远了,每走一步求出目标的可能范围区域面积

http://poj.org/problem?id=2540

给出两点,已知哪点更近,也就是将区域用中垂线分开,便可以确定解在哪个区域范围之内

首先是根据两个点要求出中垂线的方程,自己YY吧,不过我的做法可能比较传统,然后还需要考虑斜率不存在的情况。

有了方程,还要注意不等式的正负,也就是区域的方向。

不断地加上新的半平面,切割原有的凸多边形。

注意:出现same的话,说明目标在中垂线上,而题目要求的是面积,所以答案为0.而且之后的所有输出都应该为0.

当之前出现了面积为0的情况,说明之前一组就已经找不到可行区域了,之后的所有答案也应为0

POJ,ZOJ,FZU都有这题,数据也有些不同,可以都尝试一下。

#include<iostream>
#include<fstream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<sstream>
#include<cassert>
#define LL long long
#define eps 1e-8
#define inf 10000
#define zero(a) fabs(a)<eps
#define N 20005
using namespace std;
struct Point{double x,y;Point(){}Point(double tx,double ty){x=tx;y=ty;}
}pre,cur,p[105],tp[105];
double xmul(Point p0,Point p1,Point p2){return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
//给出两点,算出中垂线的标准方程
void Get_midperpendicular(Point p1,Point p2,double &a,double &b,double &c){//中垂线斜率为0if(zero(p1.x-p2.x)) a=0,b=1;//中垂线斜率不存在else if(zero(p1.y-p2.y)) a=1,b=0;//一般情况else b=p2.y-p1.y,a=p2.x-p1.x;c=-a*(p2.x+p1.x)/2-b*(p2.y+p1.y)/2;
}
Point Get_Intersection(Point p1,Point p2,double a,double b,double c){double u=fabs(a*p1.x+b*p1.y+c),v=fabs(a*p2.x+b*p2.y+c);return Point((p1.x*v+p2.x*u)/(u+v),(p1.y*v+p2.y*u)/(u+v));
}
void Cut(double a,double b,double c,Point p[],int &cnt){int tmp=0;for(int i=1;i<=cnt;i++){if(a*p[i].x+b*p[i].y+c>-eps) tp[++tmp]=p[i];else{if(a*p[i-1].x+b*p[i-1].y+c>eps)tp[++tmp]=Get_Intersection(p[i-1],p[i],a,b,c);if(a*p[i+1].x+b*p[i+1].y+c>eps)tp[++tmp]=Get_Intersection(p[i+1],p[i],a,b,c);}}for(int i=1;i<=tmp;i++)p[i]=tp[i];p[0]=tp[tmp];p[tmp+1]=p[1];cnt=tmp;
}
double Get_Area(Point p[],int n){double area=0;for(int i=2;i<n;i++)area+=xmul(p[1],p[i],p[i+1]);return fabs(area)/2.0;
}
int main(){pre.x=pre.y=0;char str[10];p[1].x=0;p[1].y=0;p[2].x=0;p[2].y=10;p[3].x=10;p[3].y=10;p[4].x=10;p[4].y=0;p[0]=p[4];p[5]=p[1];int cnt=4;double area=1.0;while(scanf("%lf%lf%s",&cur.x,&cur.y,str)!=EOF){double a,b,c;Get_midperpendicular(pre,cur,a,b,c);//确定不等式,使得区域范围为ax+by+c>0if(strcmp(str,"Colder")==0){if(a*pre.x+b*pre.y+c<-eps){a=-a;b=-b;c=-c;}}else if(strcmp(str,"Hotter")==0){if(a*cur.x+b*cur.y+c<-eps){a=-a;b=-b;c=-c;}}elsearea=0;//如果出现了same或者之前面积为0,之后都为0if(zero(area)){printf("0.00\n");continue;}Cut(a,b,c,p,cnt);area=Get_Area(p,cnt);printf("%.2f\n",area);pre=cur;}return 0;
}

POJ 2540 Hotter Colder(半平面交求可行域)相关推荐

  1. poj 1755 Triathlon (半平面交解一元二次不等式)(切割求半平面交)

    题目链接:哆啦A梦传送门 参考链接:https://blog.csdn.net/acm_cxlove/article/details/7883370 半平面交模板 题目:铁人三项,每个人在某一项中有确 ...

  2. POJ 3384 Feng Shui(半平面交)

    题意 : 给你一个凸多边形,让你在其中找两个圆,使得圆的覆盖面积最大. 这个题目和 poj 3525 有点类似,那个题目是一个圆,想到两者的联系,可以发现两个圆覆盖面积最大就是重叠面积最小,怎样使得重 ...

  3. POJ 1755 Triathlon(半平面交)

    题目链接:http://poj.org/problem?id=1755 题意:一段距离总长度为L,将L分成三部分a,b和c(a.b.c均大于0).有N(1 <= N <= 100) 个人, ...

  4. POJ 1279 Art Gallery 半平面交 多边形的核

    题意:求多边形的核的面积 套模板即可 #include <iostream> #include <cstdio> #include <cmath> #define ...

  5. POJ 1474 Video Surveillance(半平面交)

    题意:半平面交求多边形内核(我明明及的我之前是会用kuangbin第一份版平面交的,现在怎么就不会用了呢,补第二份代码) 代码: #include<cstdio> #include< ...

  6. poj 2451 Uyuw's Concert (半平面交)

    2451 -- Uyuw's Concert 继续半平面交,这还是简单的半平面交求面积,不过输入用cin超时了一次. 代码如下: 1 #include <cstdio> 2 #includ ...

  7. HDU 6617 Enveloping Convex(凸包+半平面交+二分)

    首先对于这m个点维护出一个凸包M,那么问题就变成了判断凸包P进行放大缩小能不能包含凸包M.(凸包P可以进行中心对称变换再进行放大缩小,见题意) 如何判断合适的相似比呢,我们可以用二分去放大缩小凸包P的 ...

  8. Feng Shui POJ - 3384 [半平面交]

    Feng Shui POJ - 3384 题意:n个顶点的凸包,放入2个半径为r的圆,可以重叠,要求面积最大,输出2个圆的圆心坐标(保留4位小数) 思路:找出圆心的可行域(内推r,求半平面交),再求核 ...

  9. POJ - 3384 Feng Shui(半平面交)

    链接 Feng Shui 题意 将两个半径为 rrr 的圆放入一个多边形中,两个圆占据最大面积时圆心坐标是多少: 思路 在多边形中放圆,最大圆的圆心一定在多边形内核中: 将多边形的每条边都内推 rrr ...

最新文章

  1. PostgreSQL:Problem running post-install step. The database cluster initialisation failed. 解决方法。
  2. 七、排序(4)——qsort()
  3. php拍视频上传,php视频拍照上传头像功能实现代码分享
  4. tensorflow 报错(完善中)
  5. 创建线程时候多参数传递方法及参数改变问题--扫雷辅助(三)
  6. mysql常用内置函数_mysql常见内置函数
  7. PopupWindow和AlertDialog区别
  8. 【ElasticSearch】Es 源码之 Discovery DiscoveryModule Coordinator 源码解读
  9. IPS不用添加service帐号进入linux使得管理主机能访问的方法
  10. 二叉树中的和为某一值的路径(二)(C++)
  11. Netty4.0学习笔记系列之五:自定义通讯协议
  12. 【交换机在江湖】第十五章 VLAN隔离篇
  13. 动易html编辑器,解决动易后台编辑器(混合模式,编织模式不可用变灰
  14. java 动态执行代码_java中动态执行一段代码
  15. c语言的case有什么作用,c语言case的用法
  16. 从oracle到mysql模型转换的自动化实现
  17. wifidog 整体分析
  18. 未来公园怎么能少了广场舞?
  19. Final Cut pro快捷键大全
  20. 再生核希尔伯特空间(RKHS)

热门文章

  1. 【图像识别】【读论文】模式识别方法概论模式识别及其在图像处理中的应用
  2. 阿里拍卖 捡漏 一元起拍
  3. 双足竞走机器人的意义_双足竞走机器人设计1
  4. Stream流的常用方法以及代码练习
  5. javaSE_day17 学习笔记 ——泛型、Stream
  6. 【J2EE】J2EE简介
  7. Qt大屏电子看板系统源码基础版
  8. django databased is locked
  9. faststone capture注册码
  10. javascript原型图了解