点击打开题目

题目大意:

以顺时针或逆时针给出一个简单多边形的n个点的坐标,用n-2条互不相交的,且与边不相交的对角线,分成n-2个三角形,要求其中最大三角形的面积最小

开始还汪星人咬乌龟,无从下口,但在度娘翻译的帮助下,看到了顺时针,眼前一亮,环形的分割问题

设f[i][j]表示从i号点到j号点这个子多边形的最大三角形面积最小值,则列出状态转移方程:

f[i][j]=min(f[i][j],max(S(i,j,k),max(f[i][k],f[k+1][j])));

不会算面积?海伦公式一波带走

设三角形三边为abc,设p=(a+b+c)/2

则S=(√p⋅(p−a)⋅(p−b)⋅(p−c))

美滋滋地码好代码交上去,WA了,我艹

猛然发现,(用n-2条互不相交的,且与边不相交的对角线)

23333333333333……

于是换个角度想想,如果一条对角线与边相交,那这条对角线形成的某个三角形,内部一定有点,于是我们可以枚举出这个点,如果某个点i,与三角形三点abc,形成:

S(a,b,i)+S(a,c,i)+S(b,c,i)=S(a,b,c)

那么这个点一定在三角形内,排除掉就行了

代码如下:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>
#include<algorithm>
#define INF 1<<30
#define eps 0.001
using namespace std;
double f[51][51];
double dis[51][51];
int n,x[51],y[51];
int getint()
{
int num=0,flag=1;char c;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
return num*flag;
}
double S(double a,double b,double c)
{
double p=(a+b+c)/2;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
bool check(int a,int b,int c)
{
for(int i=1;i<=n;i++)
if(i!=a&&i!=b&&i!=c)
if(fabs(S(dis[i][a],dis[i][b],dis[a][b])+S(dis[i][a],dis[i][c],dis[a][c])+S(dis[i][b],dis[i][c],dis[b][c])-S(dis[a][b],dis[a][c],dis[b][c]))<eps)
return 1;
return 0;
}
int main()
{
int i,j,o,t=getint();
while(t--)
{
memset(f,0x7f,sizeof f);
n=getint();
for(i=1;i<n;i++)f[i][i+1]=0;
for(i=1;i<=n;i++)x[i]=getint(),y[i]=getint();
for(i=1;i<=n;i++)for(j=1;j<=n;j++)dis[i][j]=sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));
for(o=2;o<=n;o++)
for(i=1;i<=n-o;i++)
for(j=i+1;j<i+o;j++)
if(!check(i,j,i+o))
f[i][i+o]=min(max(S(dis[i][j],dis[j][i+o],dis[i+o][i]),max(f[i][j],f[j][i+o])),f[i][i+o]);
printf("%.1lf\n",f[1][n]);
}
}

UVA 最大面积最小三角形剖分的更多相关文章

  1. UVa 1331 最大面积最小的三角剖分

    https://vjudge.net/problem/UVA-1331 题意:输入一个多边形,找一个最大三角形面积最小的三角剖分,输出最大三角形的面积. 思路: 最优三角剖分. dp[i][j]表示从 ...

  2. 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵

    题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K 接下 ...

  3. 求曲线y=lnx在区间(2,6)内的一条切线,使得该切线与直线x=2,x=6及曲线y=lnx所围成的图形的面积最小。

    求曲线y=lnx在区间(2,6)内的一条切线,使得该切线与直线x=2,x=6及曲线y=lnx所围成的图形的面积最小. 1.先画图. 2.设切点为(a,lna) (2<a<6) 3.切线方程 ...

  4. UVA - 10480 Sabotage 最小割,输出割法

    UVA - 10480 Sabotage 题意:现在有n个城市,m条路,现在要把整个图分成2部分,编号1,2的城市分成在一部分中,拆开每条路都需要花费,现在问达成目标的花费最少要隔开那几条路. 题解: ...

  5. UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design

    题意: 给出一个有向带权图,找到若干个圈,使得每个点恰好属于一个圈.而且这些圈所有边的权值之和最小. 分析: 每个点恰好属于一个有向圈 就等价于 每个点都有唯一后继. 所以把每个点i拆成两个点,Xi  ...

  6. UVa 1599 (字典序最小的最短路) Ideal Path

    题意: 给出一个图(图中可能含平行边,可能含环),每条边有一个颜色标号.在从节点1到节点n的最短路的前提下,找到一条字典序最小的路径. 分析: 首先从节点n到节点1倒着BFS一次,算出每个节点到节点n ...

  7. UVA 6199 不定根最小树形图

    首先是最小树形图的介绍. 看这个博客.最小树形图 上面介绍的很详细了,我就讲一下这道题的题意. 首先给出一些二维点坐标,这些坐标之间构成一些有向图,根据题意,假设两个点a(x1 ,y1) ,b(x2 ...

  8. UVA 455(最小周期)

    最小周期可以用%枚举 #include <iostream> #include <string> #include <cstring> #include <c ...

  9. 紫书 例题 9-11 UVa 1331 (最优三角形剖分)

    设置f(i, j)为点i, i + 1 --j所组成的多边形. 那么可以枚举中间点k, 得f(i, j) = min{s(i, j, k), f(i, k), f(k, j) | i < k & ...

随机推荐

  1. sql临时表与变量表

    1)临时表存储在 tempdb 中,当不再使用时会自动删除 一般使用如下: --创建临时表 select * into #temp from TABLE --使用临时表 select * from # ...

  2. JDBC 数据源

    概述 JNDI 数据源配置的相关内容已经在 JNDI 资源文档中详细介绍过.但从 Tomcat 用户的反馈意见来看,有些配置的细节问题非常棘手. 针对常用的数据库,我们已经给 Tomcat 用户提供了 ...

  3. Java面向对象程序设计第7章1-8

    Java面向对象程序设计第7章1-8 1."程序中凡是可能出现异常的地方必须进行捕获或拋出",这句话对吗? 不对. 异常分两类,runtime异常和非runtime异常. runt ...

  4. pytorch torch.Stroage();torch.cuda()

    转自:https://ptorch.com/news/52.html torch.Storage是单个数据类型的连续的一维数组,每个torch.Tensor都具有相同数据类型的相应存储.他是torch ...

  5. javaweb项目添加log4j日志

    谈到我们在Java程序中经常用的日志,Log4j应该是耳熟能详了.这里先提下slf4j,英文全名是Simple Logging Facade for Java,直面意思是:Java的简单日志门面.sl ...

  6. JDBC 详解笔记

    # JDBC ## 1:What? 通过Java代码来操作数据库的. 数据库的种类很多,导致不同的数据库的操作方式是不同. 通过JDBC的标准完成.通过java语言完成对于数据库的CRUD. ## 2 ...

  7. elasticsearch定时删除索引第二版

    该版本对于上一个版本做了升级.兼容性更好了. #!/bin/bash ####################################################### # $Name: ...

  8. 设置本地上网IP

    在局域网中,我们经常需要根据网络连接环境来对本地连接的IP地址进行手动设置,那么如何对IP地址进行设置呢?下面小编就把教程介绍给大家. 1. 右击桌面“网上邻居”->选择“属性”,打开“网络共享 ...

  9. 浅谈Go类型转换之间的那些事

    试着答一答这些问题 s[i]和(for _,v range)的v的区别是什么 var s string = "AB" fmt.Println(reflect.TypeOf(s[0] ...

  10. yarn详细入门教程(转载)

    简介Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具.就像我们可以从官方文档了解那样,它的目的是解决这些团队使用 n ...