SCUD Busters POJ - 1264(凸包)
题意:有n个国家,输入国家的坐标让你构建国家的凸包,然后输入炮弹,当炮弹在这个国家里的话国家就被炸毁了求最后被炸毁的总面积。
wa的点!!!!有可能反复炸一个国家不能重复计算面积
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cstdio>using namespace std;const int maxn=200;
const double eps=1e-8;int sgn(double x)
{if(fabs(x)<eps)return 0;if(x<0)return -1;elsereturn 1;
}
struct Point
{double x,y;Point(){}Point(double _x,double _y){x=_x;y=_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;}
};struct Line
{Point s,e;Line(){}Line(Point _s,Point _e){s=_s;e=_e;}
};
int n;
Point p[maxn];
int Stack[maxn];
int top=0;double dist(Point a,Point b)
{return sqrt((a-b)*(a-b));
}
bool cmp(Point a,Point b)
{int ans=sgn((a-p[0])^(b-p[0]));if(ans==1)return true;else if(ans==0)return dist(a,p[0])<dist(b,p[0]);elsereturn false;
}
void graham()
{for(int i=0;i<n;i++){if(p[i].y<p[0].y||(p[i].y==p[0].y&&p[i].x<p[0].x))swap(p[i],p[0]);}sort(p+1,p+n,cmp);if(n==1){Stack[0]=0;top=1;}else if(n==2){Stack[0]=0;Stack[1]=1;top=2;}else{Stack[0]=0;Stack[1]=1;top=2;for(int i=2;i<n;i++){while(top>1&&((p[Stack[top-1]]-p[Stack[top-2]])^(p[i]-p[Stack[top-2]]))<=0)top--;Stack[top++]=i;}}
}vector <Point> ve[maxn];double CalcArea(vector <Point> &ve)
{double res=0;for(int i=0;i<ve.size();i++){res+=(ve[i]^ve[(i+1)%ve.size()])/2;}return fabs(res);
}bool OnSeg(Point p,Line l)
{return sgn((l.s-p)^(l.e-p))==0&&sgn((p.x-l.s.x)*(p.x-l.e.x))<=0&&sgn((p.y-l.s.y)*(p.y-l.e.y))<=0;
}int inConvexPoly(Point p1,vector <Point> &ve)
{for(int i=0;i<ve.size();i++){if(sgn((ve[i]-p1)^(ve[(i+1)%(ve.size())]-p1))<0)return -1;else if(OnSeg(p1,Line(ve[i],ve[(i+1)%(ve.size())])))return 0;}return 1;
}
int main()
{int cont=0;double ans=0;while(1){scanf("%d",&n);if(n==-1)break;for(int i=0;i<n;i++)scanf("%lf %lf",&p[i].x,&p[i].y);top=0;graham();for(int i=0;i<top;i++){ve[cont].push_back(p[Stack[i]]);}//ans+=CalcArea(ve[cont]);cont++;}//printf("%.2lf\n",ans);double x,y;int check[maxn]={0};while(scanf("%lf %lf",&x,&y)!=EOF){Point p1=Point(x,y);for(int i=0;i<cont;i++){if(inConvexPoly(p1,ve[i])>=0&&check[i]==0){check[i]=1;ans+=CalcArea(ve[i]);continue;}}}printf("%.2lf\n",ans);return 0;
}
SCUD Busters POJ - 1264(凸包)相关推荐
- UVa 109 - SCUD Busters(凸包计算)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- uva 109 SCUD Busters
题意:有很多国家,国家的边界是包括房子和发电站的凸包,当发动战争是,会用飞毛腿导弹摧毁对方的发电站,则这个国家就会灭亡,给出每个国家的点的集合,包括房子和发电站,给出炮弹可以打中的点,计算出被摧毁的国 ...
- UVa Problem 109 - SCUD Busters
// UVa Problem 109 - SCUD Busters // Verdict: Accepted // Submission Date: 2011-11-24 // UVa Run Tim ...
- poj 1264 hdu 1616 SCUD Busters 凸包+面积计算
http://poj.org/problem?id=1264 这题很看郁闷,看了很久才明白是什么意思.大致就是有数个国家,每个国家有数个房子,房子相互连接组成的最小周长的多边形为该国家领土,当输入-1 ...
- poj 1264 || UVA 109 SCUD Busters
UVA这题过得蛮多人的,觉得应该是个水题吧. 一读题,也不麻烦,给你N个王国,求下凸包,再求面积.给你一些炮弹,问炮弹炸掉的面积.(一个炮弹炸的话,整个王国都被炸了). 直接求凸包后,求出各个王国的面 ...
- poj 1264 SCUD Busters
题意:给出一个k个王国, 每个由Ni个点的确定的凸包确定.之后给出多个炮弹, 如果炮弹落在凸包里, 该王国被停电,王国没有重合面积.问被停电的面积. 分析:简单多边形面积, 点和凸包的关系. #inc ...
- UVA 109 SCUD Busters【凸包模拟题】
题目大意:世界由几个互不重叠领土但彼此敌对的国家组成,每个国家有一个发电站,负责给本国发电. 1,给出每个国家的建筑数(包括发电站和房子数),每个国家用最少的围墙将本国保护起来(凸包): 2,现在有不 ...
- UVA 109 || SCUD Busters(凸包面积计算
= = 模板水题.看数据就可以做了. 输出被炸弹轰炸之后,所有王国停电的总面积,保留小数点后两位. 题目中说到每个王国的边界是围城这些点的最小周长,所以可以推出,每个王国都是一个凸包圈住的点集: 第一 ...
- POJ1264 SCUD Busters 凸包
POJ1264 有m个国家(m<=20)对每个国家给定n个城镇 这个国家的围墙是保证围住n个城镇的周长最短的多边形 必然是凸包 进行若干次导弹发射 落到一个国家内则国家被破坏 最后回答总共有多少 ...
最新文章
- 【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )
- 解决nginx重启“var/run/nginx/nginx.pid no such file or directory问题
- Leetcode 134. 加油站 解题思路及C++实现
- java paint方法哪个周期调用_关于一段java程序的小问题,paint函数是什么时候执行的,没有调用啊...
- html代码常用软件,HTML代码实际应用讲解
- 笔记:less的三种使用方法
- php 异步post,php – 使用POST的异步cURL
- php标签嵌入规范,HTML标签嵌套的详细规则
- 优先队列c++ STL用法
- galera mysql cluster
- 自动驾驶_高精地图与车辆协同
- 点击文本或按钮实现复制
- 直线插补算法---matlab仿真程序
- 计算机信息管理调查报告模板,精选市场调查报告模板锦集九篇
- 完美解决Sudo doesn‘t work: “/etc/sudoers is owned by uid 1000, should be 0”
- 岩板铺地好吗_**岩板铺地「泉州泰亨石材供应」
- Spring—xml和注解
- WMS、WFS、WMTS、TMS
- 苹果app禁止手势退出
- c语言wscript.echo用法,2.4.3 用Wscript.Echo显示简单的文本信息