UVALive 5878 - Shortest Leash 【计算几何】

来源:互联网 发布:mac怎么安装程序 编辑:程序博客网 时间:2024/05/29 17:14

题目大意:给你一堆向量,每个向量可以选择正向或者反向,最后加起来,求最大模。


把向量和反向量一起按极角排序,从中任取连续的n个,这n个向量一定不会全部包含任意一个向量的正反向量,所以找n次,每次找连续n个,找最大模出来就行了。


#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<map>using namespace std;struct xiangliang{int x,y;int hao;bool friend operator<(xiangliang a,xiangliang b){if(a.hao!=b.hao)return a.hao<b.hao;return a.x*b.y-a.y*b.x>0;}}a[210];int n;double MAKE(int x){double xx=0,yy=0;for(int i=1;i<=n;i++){xx+=a[x+i-1].x;yy+=a[x+i-1].y;}return sqrt(xx*xx+yy*yy);}int main(){while(~scanf("%d",&n)){if(!n)break;for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);for(int i=1;i<=n;i++){a[i+n].x=-a[i].x;a[i+n].y=-a[i].y;}for(int i=1;i<=2*n;i++){if(a[i].x>0&&a[i].y>0)a[i].hao=1;if(a[i].x<0&&a[i].y>0)a[i].hao=1;if(a[i].x<0&&a[i].y<0)a[i].hao=2;if(a[i].x>0&&a[i].y<0)a[i].hao=2;if(a[i].x>0&&a[i].y==0)a[i].hao=1;if(a[i].x<0&&a[i].y==0)a[i].hao=2;if(a[i].x==0&&a[i].y==0)a[i].hao=0;if(a[i].x==0&&a[i].y>0)a[i].hao=1;if(a[i].x==0&&a[i].y<0)a[i].hao=2;}sort(a+1,a+1+2*n);double ans=0;for(int i=1;i<=n;i++)ans=max(ans,MAKE(i));printf("%.3f\n",ans);}return 0;}


0 0
原创粉丝点击