hdu3685(几何重心与凸包结合)
来源:互联网 发布:30岁后的美工 编辑:程序博客网 时间:2024/05/01 00:13
题意:给一个多边形(有可能是凹多边形)。问有多少种能够使得它稳定放置的方式。当然稳定的原则就是重心做垂线在支撑点之内。
解法:因为有可能是凹多边形,所以先求出多边形的凸包,这是在放置时候会接触地面的所有点。然后将重心与每天凸边判断是否稳定;
代码:
/******************************************************* @author:xiefubao*******************************************************/#pragma comment(linker, "/STACK:102400000,102400000")#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <queue>#include <vector>#include <algorithm>#include <cmath>#include <map>#include <set>#include <string.h>//freopen ("in.txt" , "r" , stdin);using namespace std;#define eps 1e-8#define zero(_) (_<=eps)const double pi=acos(-1.0);typedef long long LL;const int Max=100010;const LL INF=0x3FFFFFFF;struct point{ double x,y;};point points[50005];point focus;int top;int stack[50005];int N;double mult(point a,point b,point c){ a.x-=c.x; a.y-=c.y; b.x-=c.x; b.y-=c.y; return a.x*b.y-a.y*b.x;}double dis(const point& a,const point& b){ return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}bool operator<(point a,point b){ if(mult(a,b,points[0])>0||(mult(a,b,points[0])==0 && a.x<b.x)) return true; else return false;}point OK(point a,point b,point c){ point ans; ans.x=(a.x+b.x+c.x)/3; ans.y=(a.y+b.y+c.y)/3; return ans;}void getFocus(point& focus,point* points,int N){ focus.x=0; focus.y=0; double base=0; for(int i=2; i<N; i++) { double t=mult(points[0],points[i-1],points[i]); point pp=OK(points[0],points[i-1],points[i]); focus.x+=t*pp.x; focus.y+=t*pp.y; base+=t; } focus.x/=base; focus.y/=base;}int getans(){ int ans=0; for(int i=0; i<top; i++) { double l=dis(focus,points[stack[i]]); double r=dis(focus,points[stack[i+1]]); double u=dis(points[stack[i]],points[stack[i+1]]); if(l+u>r&&r+u>l) ans++; } double l=dis(focus,points[stack[top]]); double r=dis(focus,points[stack[0]]); double u=dis(points[stack[top]],points[stack[0]]); if(l+u>r&&r+u>l) ans++; return ans;}void graham(int n){ int mi=0; for(int i=1; i<n; i++) { if(points[i].y<points[mi].y||(points[i].y==points[mi].y&&points[i].x<points[mi].x)) mi=i; } point a=points[0]; points[0]=points[mi]; points[mi]=a; sort(points+1,points+n); stack[0]=0; stack[1]=1; stack[2]=2; top=2; for(int i=3; i<n; i++) { while(top>0&&mult(points[stack[top]],points[stack[top-1]],points[i])>=0) { top--; } stack[++top]=i; }}int main(){ int t; cin>>t; while(t--) { scanf("%d",&N); for(int i=0; i<N; i++) { scanf("%lf%lf",&points[i].x,&points[i].y); } getFocus(); graham(N); cout<<getans()<<endl; } return 0;}
0 0
- hdu3685(几何重心与凸包结合)
- HDU3685稳定多边形(求多边形重心+凸包)
- uva 1438 - Asteroids(几何重心+凸包)
- HDU 4273(计算几何+凸包重心)
- HDU3685计算几何
- HDU 3685 (凸包重心)
- uvalive4838(凸包+重心)
- hdu3685
- HDU3685 RotationalPainting 计算几何 ACM2010杭州站
- 三维计算几何模板--表面三角形个数 表面多边形个数 三维凸包 表面积 凸包重心 点到面的距离
- 求多边形重心(计算几何)
- uva 1100 - Paperweight(几何重心)
- nyoj_3:多边形重心问题(计算几何)
- 凸包和重心求法
- 凸包+多边形重心模板
- HDU 3685 (凸包 重心)
- Asteroids (三维凸包+重心)
- 几何与力量的结合
- X86 CPU段式与页式存管分析
- eclipse Java调试笔记
- NYOJ 10 skiing
- wamp出现You don’t have permission to access/on this server提示
- C++11新特性:范围for循环和lambda表达式
- hdu3685(几何重心与凸包结合)
- Repeater设置显示或隐藏列
- 手动将Apache注册为系统服务
- jQuery 鼠标滚轮实现图片缩放
- 初次接触Nutz - 搭建基础框架
- 利用51系列单片机定时器功能实现测量脉冲宽度
- Merge Sorted Array-LeetCode
- 一个简单的网络爬虫---爬取网页中的图片
- malloc的实现