uva,132 Bumpy Objects (凸包,角度)
来源:互联网 发布:长沙知豆电动车租赁 编辑:程序博客网 时间:2024/06/07 00:13
题意:自己百度吧,有全翻译的。
分析:先求凸包,然后判断重心是否在凸多边形的边上面,也就是说边和重心组成的三角形,重心为顶点,下面两个底角不为钝角就是说明此时重心在线段上侧。然后遍历所有点,判断是否在该边上,找到该边上标号最大的点。
#include <iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;#define N 999999#define INF 0x7fffffff#define EPS 1e-6struct point{ double x,y; int index; point(double x,double y):x(x),y(y){} point(){} bool operator< (const point &s)const { return (x-s.x<-EPS)||(abs(x-s.x)<EPS&&y<s.y); } double det(point a) { return x*a.y-y*a.x; } double dot(point a) { return x*a.x+y*a.y; } point operator-(point a) { return point(x-a.x,y-a.y); } point operator +(point a) { return point(x+a.x,y+a.y); } point operator *(double s) { return point(x*s,y*s); } point operator /(double s) { return point(x/s,y/s); }};point p[N],res[N];bool on_seg(point p1,point p2,point p3);void convex_hull();bool point_to_seg(point p1,point p2,point p3);double dist(point p1,point p2);int k,n;int main(){ string s; point pc; while(cin>>s&&s[0]!='#') { scanf("%lf%lf",&pc.x,&pc.y); n=-1; do { n++; scanf("%lf%lf",&p[n].x,&p[n].y); p[n].index=n+1; }while(!(abs(p[n].x)<EPS&&abs(p[n].y)<EPS)); //cout<<n<<endl; convex_hull(); int ans=INF; for(int i=0;i<k-1;i++) { //cout<<res[i].x<<" "<<res[i].y<<" "<<res[i].index<<endl; if(point_to_seg(res[i],res[i+1],pc)) { int temp=max(res[i].index,res[i+1].index); for(int j=0;j<n;j++) { if(on_seg(res[i],res[i+1],p[j])) { temp=max(p[j].index,temp); } } // cout<<temp<<endl; ans=min(ans,temp); } } cout<<s<<" "; printf("%d\n",ans); } return 0;}//p3是否在线段p1和p2之间的区域内。bool point_to_seg(point p1,point p2,point p3){ double A=dist(p1,p3); double B=dist(p2,p3); double C=dist(p1,p2); return (A*A+C*C-B*B>-EPS&&B*B+C*C-A*A>-EPS);}//求凸包void convex_hull(){ sort(p,p+n); k=0; for(int i=0;i<n;i++) { while(k>1&&(res[k-1]-res[k-2]).det(p[i]-res[k-2])<=EPS) k--; res[k++]=p[i]; } int t=k; for(int i=n-2;i>=0;i--) { while(k>t&&(res[k-1]-res[k-2]).det(p[i]-res[k-2])<=EPS) k--; res[k++]=p[i]; }}//判断点是否在线段上bool on_seg(point p1,point p2,point p3){ return abs((p1-p3).det(p2-p3))<EPS;//&&(p1-p3).dot(p2-p3)<EPS;}//两点之间的距离double dist(point p1,point p2){ return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}
0 0
- uva,132 Bumpy Objects (凸包,角度)
- UVA 132 Bumpy Objects【凸包变形】【附图】
- 1178 Bumpy Objects问题(虽然是presentation error,没办法了)
- uva 10652(凸包)
- uva 10256(凸包)
- uva 11726(凸包)
- uva 10652 凸包
- uva 11168 凸包
- uva 10256 凸包
- uva 2453 凸包
- UVA-10652-凸包
- UVA-11168-凸包
- UVA 11168 - Airport 凸包
- UVA 11168 Airport(凸包)
- UVA 11168 Airport(凸包)
- UVa 11168 Airport 凸包
- UVa 11168 Airport , 凸包
- uva 10652(凸包)
- Google FCM推送服务在eclipse上跑起来!!
- Android中Style和Theme的使用
- Java中Vector和ArrayList解析
- js every扩展
- 数据库-游标
- uva,132 Bumpy Objects (凸包,角度)
- STM32 SPI难点浅析
- Protocol Buffer的详解,使用及原理
- iOS开发之高级视图—— UITableView(四)自定义Cell
- oracl 11 无法将空表导出,
- iostat命令——用于输出CPU和磁盘I/O相关的统计信息
- android 处理程序全局异常和错误,UncaughtExceptionHandler
- Install Cassandra on windows
- mongo分组聚合(sum)在java中的用户:Aggregation agg = newAggregation();