hdu3685(几何重心与凸包结合)

题意:给一个多边形(有可能是凹多边形)。问有多少种能够使得它稳定放置的方式。当然稳定的原则就是重心做垂线在支撑点之内。

解法:因为有可能是凹多边形,所以先求出多边形的凸包,这是在放置时候会接触地面的所有点。然后将重心与每天凸边判断是否稳定;

代码:

/******************************************************
* @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;
}
时间: 2024-07-29 05:31:28

hdu3685(几何重心与凸包结合)的相关文章

hdu3685 Rotational Painting 求多边形重心和凸包

http://acm.hdu.edu.cn/showproblem.php?pid=3685 Rotational Painting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2614    Accepted Submission(s): 737 Problem Description Josh Lyman is a gifted

hdu1115(计算多边形几何重心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1115 题意:给出一些点,求这些点围成的多边形的重心: 思路: 方法1:直接分别求所有点的x坐标的平均值和y坐标的平均值,即答案:不过这个方法的计算精度不是很高,要求高精度时用另一个方法: 方法2: 用公式:x = (xi*si*+...xn*sn)/(si+...+sn): y = (yi*si*+...yn*sn)/(si+...+sn): 方法2的代码: 1 #include <iostream

简单几何(向量旋转+凸包+多边形面积) UVA 10652 Board Wrapping

题目传送门 题意:告诉若干个矩形的信息,问他们在凸多边形中所占的面积比例 分析:训练指南P272,矩形面积长*宽,只要计算出所有的点,用凸包后再求多边形面积.已知矩形的中心,向量在原点参考点再旋转,角度要转换成弧度制. /************************************************ * Author :Running_Time * Created Time :2015/11/10 星期二 10:34:43 * File Name :UVA_10652.cpp

oracle spatial操作geometry方法

两个对象之间关系: RELATE SDO_GEOM.RELATE --确定两个对象的交互方式 WITHIN_DISTANCE 验证: VALIDATE_GEOMETRY_WITH_CONTEXT VALIDATE_LAYER_WITH_CONTEXT 单对象操作: SDO_ARC_DENSIFY SDO_GEOM.SDO_ARC_DENSIFY --简化,将圆弧简化成由直线组成的近似多段线:将圆近似成N多边形 SDO_AREA SDO_GEOM.SDO_AREA --计算多边形的面积 SDO_B

要开始算法了 什么顺序呢?

ACM 中常用的算法有哪些? 在网上看到别人ACM学习的心得,转载过来,源地址不记得了,当时是百度的.内容如下: 网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以水题为主(就是没有任何算法,自己靠动脑筋能够实现的),这种题目特点是麻烦,但是不难,30-50道题目就可以了. 然后可以接触一下基础的算法,我感觉搜索方向的比较不错,可以解决很多问题,深搜,广搜,然后各种剪枝能力的锻炼. 搜索感觉不错了就可以去看看贪心,图论,和动态规划

【分享】近4000份数学学习资源免费分享给大家

一直以来喜欢收集数学类的教程资源,于是费了好大劲从万千合集站上扒拉了下来,总结归类了一下,一共有将近4000本电子书.经测试,均可免费下载,可能会弹出小广告,可不必理会之.[仅供学术学习和交流,请无用于商业用途.]另外,如有可能,还请尽量支持正版纸质书.   数学史(54)     数学史.rar 55.6 MB   数学的起源与发展.rar 4.3 MB   费马大定理—一个困惑了世间智者358年的谜.pdf 9.5 MB   通俗数学名著译丛14-无穷之旅:关于无穷大的文化史.pdf 14.

【字体设计】如何更好的吸引人?不满意不要钱!

(提供专业.高效的字体设计服务,不满意不收费,联系QQ:3168579596) 字体设计,点击查看!>> 在视觉设计工作中,几乎每项任务都会使用到字体.字体具有非常多的风格,不同风格类型所表达的感情是不一样的.但是通过一些简单的字体改造就能够让字体风格符合我们的需求.下面一品威客网小编告诉您最基础字体设计改造方法,如何让字体活泼起来. 字体是最基础的设计元素,也是设计中必不可少的表达工具.在恰当的环境下使用合适的字体,可以让设计更生动严谨.在运营活动.海报.书籍.包装等诸多媒介中,文字部分作为

常见的5中聚类算法

聚类是机器学习中一种方法,常用用于处理数据分组的问题.给定一组数据,利用聚类算法将每一个数据点分批到一个特定的组.这就要求对于同一组的数据点,应该具有相同的性质(特征):对于不同组的数据点,在性质(特征)上应该有显著的区别.聚类算法数据无监督学习(unsupervised learning),常用于处理静态数据的分类问题. K-Means K-Means算法是一种简单的迭代性聚类算法,采用距离作为相似性度量指标.从而将给定的数据集分为K个类,每个类的中心是由该类中所有点的均值得到,每个类均由聚类

POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心

题意: 两个凸多面体,可以任意摆放,最多贴着,问他们重心的最短距离. 解法: 由于给出的是凸多面体,先构出两个三维凸包,再求其重心,求重心仿照求三角形重心的方式,然后再求两个多面体的重心到每个多面体的各个面的最短距离,然后最短距离相加即为答案,因为显然贴着最优. 求三角形重心见此: http://www.cnblogs.com/whatbeg/p/4234518.html 代码:(模板借鉴网上模板) #include <iostream> #include <cstdio> #in