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;
}
hdu3685(几何重心与凸包结合)的更多相关文章
- hdu1115(计算多边形几何重心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1115 题意:给出一些点,求这些点围成的多边形的重心: 思路: 方法1:直接分别求所有点的x坐标的平均值 ...
- 简单几何(向量旋转+凸包+多边形面积) UVA 10652 Board Wrapping
题目传送门 题意:告诉若干个矩形的信息,问他们在凸多边形中所占的面积比例 分析:训练指南P272,矩形面积长*宽,只要计算出所有的点,用凸包后再求多边形面积.已知矩形的中心,向量在原点参考点再旋转,角 ...
- Gym - 101673:B Craters (几何,求凸包)
题意:给定几个圆,求最短的围合,把这几个包围起来,而且到圆的距离都不小于10. 思路:把每个圆的半径+10,边等分5000份,然后求凸包即可. #include<bits/stdc++.h> ...
- SQL求几何重心
ST_Centroid(geometry); geometry :a specified ST_Geometry e.g.: select ST_AsText(ST_Centroid('0103000 ...
- 【bzoj2300】【Luogu P2521】 [HAOI2011]防线修建 动态凸包,平衡树,Set
一句话题意:给你一个凸包,每次可以插入一个点或者询问周长. 动态凸包裸题嘛,用\(Set\)实现.最初每个点坐标做乘三处理,便于取初始三角形的重心作为凸包判定原点. #include <bits ...
- GeoPandas官方中文文档--译著
译自GeoPandas 0.1.0 文档(原版译著,有错误欢迎交流,转载请注明) GeoPandas是一个开源项目,它的目的是使得在Python下更方便的处理地理空间数据.GeoPandas扩展了pa ...
- (数据科学学习手札74)基于geopandas的空间数据分析——数据结构篇
本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 geopandas是建立在GEOS.GDAL.P ...
- ACM 中常用的算法有哪些? 2014-08-21 21:15 40人阅读 评论(0) 收藏
ACM 中常用的算法有哪些?作者: 张俊Michael 网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以水题为主(就是没有任何算法, ...
- ACM 中常用的算法有哪些?
在网上看到别人ACM学习的心得,转载过来,源地址不记得了,当时是百度的.内容如下: 网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以 ...
随机推荐
- openstack 监控 - 整合nagios 调研总结
https://blog.csdn.net/soft_lawrency/article/details/8590562
- Python的程序结构[3] -> 变量/Variable[1] -> LEGB 法则
LEGB法则 / LEGB Rule LEGB 变量搜索顺序 ---- 来源于<Python学习手册>/ Learning Python Page 419 ---- Python 的变量名 ...
- 洛谷——P1258 小车问题
P1258 小车问题 题目描述 甲.乙两人同时从A地出发要尽快同时赶到B地.出发时A地有一辆小车,可是这辆小车除了驾驶员外只能带一人.已知甲.乙两人的步行速度一样,且小于车的速度.问:怎样利用小车才能 ...
- Lowest Common Ancestor of a Binary Search Tree -- LeetCode
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...
- 在Spring MVC Controller中注入HttpServletRequest对象会不会造成线程安全的问题
做法: 1.比如我们在Controller的方法中,通常是直接将HttpServletRequest做为参数,而为了方便节省代码,通常会定义为全局变量,然后使用@Autowire注入. 说明: 1.观 ...
- IOS调用WCF提供的服务方法,但是方法的参数是WCF那边自定义的对象,这样有办法调用么,如果可以IOS应该怎么传参呢?请问有了解的么,
最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想到其中碰到不少问题,在网上搜索很久一直没有想到 ...
- 粗谈CDN
CDN:内容分发网络(content delivery network) 1.DNS解析到最快(有可能是地理上最近,也有可能是地理上远但是链路最好)的CDN缓存设备 2.从CDN获取已经缓存的资源 3 ...
- C# HttpWebRequest 绝技 【转】
原文地址:http://www.sufeinet.com/thread-6-1-1.html 在线测试工具http://www.sufeinet.com/thread-3690-1-1.html c# ...
- ElasticSearch搜索
1.搜索---最基本的工具 我们可以将一个 JSON 文档扔到 Elasticsearch 里,然后根据 ID 检索.但 Elasticsearch 真正强大之处在于可以从无规律的数据中找出有意义的信 ...
- asp.net自制分页页码条控件
用过微软的服务器控件分页的人都知道~那卡的一A啊~ 遂想自制分页页码条控件以备不时之需. 走你~ public static class PageShow { /// <summary> ...