给你n个点,求面积最大的凸多边形,使得这个凸多边形没有内点。
考虑求凸包的graham算法,需要找到左下角的点,再进行极角排序后按顺序扫点,所以先枚举左下角的点。
这个过程中,如果遇到内点,就需要把这个内点排除掉,而现在需要把在外的点排除掉。
因为不确定凸包的边界,需要dp处理,一开始是一个三角线的两条边作为边界,然后不断枚举可能的边界进行扩展,同时保证不能包含内点。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include <set>
#include <queue>
#define ll long long
#define ld long double
#define lson l,m,rt<<1
#define pi acos(-1)
#define rson m+1,r,rt<<1|1
#define fo(i,l,r) for(int i = l;i <= r;i++)
#define fd(i,l,r) for(int i = r;i >= l;i--)
#define mem(x) memset(x,0,sizeof(x))
#define eps 3e-11
using namespace std;
const int maxn = ;
const ll inf = 1e9;
const ll mod = ;
ll read() {
ll x=,f=;
char ch=getchar();
while(!(ch>=''&&ch<='')) {
if(ch=='-')f=-;
ch=getchar();
};
while(ch>=''&&ch<='') {
x=x*+(ch-'');
ch=getchar();
};
return x*f;
}
int sgn(double x){
if(fabs(x)<eps)return ;
if(x<)return -;
return ;
}
struct Point{
int id;
double x,y;
Point(){
}
Point(double _x,double _y){
x=_x;
y=_y;
}
friend bool operator < (Point a,Point b) {
return sgn(a.x-b.x)==?sgn(a.y-b.y)<:a.x<b.x;
}
double operator ^ (const Point &b) const{
return x*b.y - y*b.x;
}
bool operator == (const Point &b) const{
return sgn(x-b.x)==&&sgn(y-b.y)==;
}
Point operator - (const Point &b) const{
return Point(x-b.x,y-b.y);
}
double distance(Point b){
return sqrt((x-b.x)*(x-b.x) + (y-b.y)*(y-b.y));
}
};
struct polygon{
int n;
Point p[maxn];
struct cmp{
Point p;
cmp(const Point &p0) {p=p0;}
bool operator()(const Point &aa,const Point &bb){
Point a=aa,b=bb;
int d=sgn((a-p)^(b-p));
if(d==){
return sgn(a.distance(p) - b.distance(p)) < ;
}
return d>;
}
};
void norm(Point t){
sort(p+,p++n,cmp(t));
}
int relationpoint(Point q){
int cnt = ;
fo(i,,n-){
int j = (i+)%n;
int k = sgn((q-p[j])^(p[i]-p[j]));
int u = sgn(p[i].y-q.y);
int v = sgn(p[j].y-q.y);
if(k>&&u<&&v>=)cnt++;
if(k<&&v<&&u>=)cnt--;
if(k==)return ;
}
return cnt != ;
}
}ps,pts,rec;
int n;
bool ok[maxn][maxn][maxn];
double dp[maxn][maxn],ans;
void gao(int st){
memset(dp,,sizeof(dp));
int m = n-st+;
pts.n=m;
fo(i,,m){
pts.p[i] = ps.p[st+i-];
}
pts.norm(pts.p[]);
fo(i,,m){
fo(j,i+,m){
if(!ok[pts.p[].id][pts.p[i].id][pts.p[j].id]){
dp[i][j] = ;
}else{
bool flag = true;
fo(k,,i-){
if(sgn((pts.p[k]-pts.p[])^(pts.p[i]-pts.p[]))==){
flag=false;
break;
}
}
if(flag)fo(k,,i-){
if(sgn((pts.p[i]-pts.p[k])^(pts.p[j]-pts.p[i]))>=){ dp[i][j] = max(dp[i][j],dp[k][i]);
}
}
dp[i][j] += ((pts.p[i]-pts.p[]) ^ (pts.p[j]-pts.p[]))/2.0;
}
ans=max(ans,dp[i][j]);
}
}
}
int main() {
int T=read();
while(T--){
ans=;
n=ps.n=read();
fo(i,,n){
ps.p[i] = Point(read(),read());
}
sort(ps.p+,ps.p++n);
fo(i,,n) ps.p[i].id=i;
fo(i,,n){
fo(j,i+,n){
fo(k,j+,n){
rec.n=;
rec.p[]=ps.p[i];rec.p[]=ps.p[j];rec.p[]=ps.p[k];
ok[k][i][j]=ok[k][j][i]=ok[j][i][k]=ok[j][k][i]=ok[i][k][j]=ok[i][j][k]=true;
if(sgn((rec.p[]-rec.p[])^(rec.p[]-rec.p[]))==)continue;
fo(t,,n){
if(t==i||t==j||t==k)continue;
if(rec.relationpoint(ps.p[t])==){
ok[k][i][j]=ok[k][j][i]=ok[j][i][k]=ok[j][k][i]=ok[i][k][j]=ok[i][j][k]=false;
break;
}
}
}
}
}
fo(i,,n){
gao(i);
}
printf("%.1f\n",ans);
}
return ;
}
 

hdu 6219 Empty Convex Polygons (凸包)的更多相关文章

  1. 2017ACM/ICPC亚洲区沈阳站 C Hdu-6219 Empty Convex Polygons 计算几何 最大空凸包

    题面 题意:给你一堆点,求一个最大面积的空凸包,里面没有点. 题解:红书板子,照抄完事,因为题目给的都是整点,所以最后答案一定是.5或者.0结尾,不用对答案多做处理 #include<bits/ ...

  2. hdu6219 Empty Convex Polygons (最大空凸包板子

    https://vjudge.net/contest/324256#problem/L 题意:给一堆点,求最大空凸包面积. 思路:枚举凸包左下角点O,dp找出以这个点为起始位置能构成的最大空凸包面积, ...

  3. HDU 6617 Enveloping Convex(凸包+半平面交+二分)

    首先对于这m个点维护出一个凸包M,那么问题就变成了判断凸包P进行放大缩小能不能包含凸包M.(凸包P可以进行中心对称变换再进行放大缩小,见题意) 如何判断合适的相似比呢,我们可以用二分去放大缩小凸包P的 ...

  4. HDU 1392 Surround the Trees(凸包*计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392 这里介绍一种求凸包的算法:Graham.(相对于其它人的解释可能会有一些出入,但大体都属于这个算 ...

  5. HDU 4946 Area of Mushroom 凸包

    链接:pid=4946">http://acm.hdu.edu.cn/showproblem.php?pid=4946 题意:有n个人.在位置(xi,yi),速度是vi,假设对于某个点 ...

  6. HDU 4946 Area of Mushroom 凸包 第八次多校

    题目链接:hdu 4946 题意:一大神有N个学生,各个都是小神,大神有个二次元空间,每一个小神都有一个初始坐标,如今大神把这些空间分给徒弟们,规则是假设这个地方有一个人比谁都先到这,那么这个地方就是 ...

  7. Opencv Convex Hull (凸包)

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  8. HDU - 1392 Surround the Trees (凸包)

    Surround the Trees:http://acm.hdu.edu.cn/showproblem.php?pid=1392 题意: 在给定点中找到凸包,计算这个凸包的周长. 思路: 这道题找出 ...

  9. HDU 1392 Surround the Trees (凸包周长)

    题目链接:HDU 1392 Problem Description There are a lot of trees in an area. A peasant wants to buy a rope ...

随机推荐

  1. vue elementui table组件内容换行

    解决方案 tableData = [ { "name": "domain111", "metric": [ "平均耗时" ...

  2. Linux之RedHat7如何更换yum源

    目前,我们常见的系统大概就是Windows.Linux和Mac OS了.Windows系统应该是大部分人最早开始接触的系统,毕竟Windows系统使用起来相当方便,只需要点点鼠标,外加会简单的打字,一 ...

  3. SOA,Webservice,SOAP,REST,RPC,RMI,JMS的区别与联系(转载)

    原文地址:http://blog.csdn.net/pcceo1/article/details/51245249 SOA面向服务的软件架构(Service Oriented Architecture ...

  4. 2018微信小程序官方示例源码最新版

    忘记从哪获得的 CSDN  可以支持一下 谢谢你们 https://download.csdn.net/download/lan1128/10197682 当然也有免费的 代码在码云上免费公开 点个关 ...

  5. 集合综合练习<二>

    package com.JiHeTotal; import java.util.Map; public class Student { int id; String name; Map<Stri ...

  6. apk反编译(仅供娱乐)

    第一个文件夹里面放apk,第二个解析classes.dex,第三个查看java代码,下面三个apktool用来解析apk文件, 记得在环境变量中配置apktool,路径为apktool所在路径 1.解 ...

  7. 如何使用Android Studio与夜神模拟器开发调试

    (1)运行夜神模拟器, (2)打开命令行窗口, (3)打开到夜神安装目录(如cd D:\Program Files\NOX\Nox\bin)本人安装的目录, (4)执行命令:nox_adb.exe c ...

  8. 数据:ContentResolver类

    ContentResolver是通过URI来查询ContentProvider中提供的数据.除了URI以 外,还必须知道需要获取的数据段的名称,以及此数据段的数据类型.   如果你需要获取一个特定的记 ...

  9. 病毒 x

    04:病毒 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65535kB 描述 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字 ...

  10. Redis高级命令及特性(安全性)

    高级命令 ​ keys * : 返回满足的所有键 ,可以模糊匹配 ​ exists :是否存在指定的key,存在返回1,不存在返回0 ​ exprie:设置某个key的过期时间 ​ ttl:查看剩余时 ...