[hdu contest 2019-07-29] Azshara's deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法
今天hdu的比赛的第一题,凸包+区间dp。
给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相交但是可以有公共端点。
首先找出凸包,然后把n*n条边和m个圆算点到直线距离验证一下边是否与圆相交存到e[n][n]里。
然后显然是一个dp,但是我开始看错题目了以为不能有公共端点,能有公共端点的情况考虑一下像一个找三角形的过程,就是区间dp。
区间dp有一点妙的地方是最大区间范围是凸包点数而不用+1,因为连线的两个点不能在凸包上相邻所以这样就能直接得到最大值。
今天疯狂坑队友了,我要是帮着队友查错就能多对一道题了,因为自己菜没有写出来题还连累队友真的真的很抱歉。
代码在下面,也算是复习dp和码一个找凸包板子,这个方法好像叫graham扫描法?
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<vector>
#include<iomanip>
#include<stack>
#include<queue>
using namespace std;
const int maxn=;
int n,m,cnt;
int tot;
double r;
struct nod{
double x,y;
}poi[maxn],po[maxn*],ci[maxn];
bool e[maxn][maxn]={};
int f[maxn*][maxn*]={};
bool cmp(nod a,nod b){
double aa=atan2(a.y-po[].y,a.x-po[].x);
double bb=atan2(b.y-po[].y,b.x-po[].x);
if(aa==bb) return a.x<b.x;
return aa<bb;
}
double cro(nod a,nod b,nod c){
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
void getpo(){
int t=;
for( int i=; i<=n; ++i) {
if( poi[i].y < poi[t].y||( poi[i].y == poi[t].y&&poi[i].x < poi[t].x) ) t=i;
}
po[++cnt]=poi[t];swap(poi[t],poi[]);
sort(poi+,poi+n+,cmp);
po[++cnt]=poi[];
for(int i=;i<=n;++i){
//cout<<poi[i].x<<poi[i].y<<endl;
while(cnt>&&cro(po[cnt-],poi[i],po[cnt])>=)--cnt;
po[++cnt]=poi[i];
}
}
int main(){
int T;scanf("%d",&T);
while(T--){
tot=;
cnt=;
memset(e,,sizeof(e));
memset(f,,sizeof(f));
scanf("%d%d%lf",&n,&m,&r);
for( int i=; i<=n; ++i) scanf("%lf%lf",&poi[i].x,&poi[i].y);
for( int i=; i<=m; ++i) scanf("%lf%lf",&ci[i].x,&ci[i].y);
getpo();//cout<<1111111<<endl;
for(int i=;i<=cnt;++i){
// cout<<po[i].x<<po[i].y<<endl;
for(int j=i+;j<=cnt;++j){
if(i==&&j==cnt)continue;
double a=po[i].y-po[j].y,b=po[j].x-po[i].x;
double c=-(a*po[i].x+b*po[i].y);
e[i][j]=;
e[j][i]=;
for(int w=;w<=m;++w){
double ju=a*ci[w].x+b*ci[w].y+c;
if(ju<)ju=-ju;
ju/=sqrt(a*a+b*b);
if(ju>r)continue;
e[i][j]=;
e[j][i]=;
}
//cout<<i<<j<<e[i][j]<<endl;
}
}
int ans=;
for(int k=;k<=cnt;++k){
for(int i=,j=k;j<cnt*;++i,++j){
for(int t=i;t<=j;++t){
f[i][j]=max(f[i][j],f[i][t]);
if(e[(t-)%cnt+][(j-)%cnt+])f[i][j]=max(f[i][j],f[i][t]+);
}
}
}
for(int i=;i<=cnt;++i)ans=max(ans,f[i][i+cnt-]);
printf("%d\n",ans);
}
return ;
}
[hdu contest 2019-07-29] Azshara's deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法的更多相关文章
- HDU 5928 DP 凸包graham
给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...
- [2019HDU多校第三场][HDU 6603][A. Azshara's deep sea]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6603 题目大意:给出一个凸包,凸包内有若干个圆,要求画尽可能多的对角线使得他们两两不在凸包内相交且不与 ...
- HDU 6603 Azshara's deep sea(凸包+区间DP)
由于题目要求,首先维护出一个凸包,然后在凸包上寻找点对关系,用rel[i][j]表示i点和j点之间是否可以连线,又由于维护出来的凸包上的点的个数不多,可以直接枚举点对并枚举所有圆,判断两点直线和圆是否 ...
- 【NOI2019模拟2019.6.29】组合数(Lucas定理、数位dp)
Description: p<=10且p是质数,n<=7,l,r<=1e18 题解: Lucas定理: \(C_{n}^m=C_{n~mod~p}^{m~mod~p}*C_{n/p} ...
- Hdu OJ 5115 Dire Wolf (2014ACM/ICPC亚洲区北京站) (动态规划-区间dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5115 题目大意:前面有n头狼并列排成一排, 每一头狼都有两个属性--基础攻击力和buff加成, 每一头 ...
- 【AtCoder】Tenka1 Programmer Contest 2019
Tenka1 Programmer Contest 2019 C - Stones 题面大意:有一个01序列,改变一个位置上的值花费1,问变成没有0在1右边的序列花费最少多少 直接枚举前i个都变成0即 ...
- 07/29/2013 02:10:02 AM - CMDPHP: Poller[0] Host[6] DS[10] WARNING: Result from SNMP not valid. Partial Result: U
snmpwalk -c public -v2c 客户端ip地址 自定义的oid 能取到数据,但是服务器端就是图片一片空白 rrdtool fetch 文件名.rrd 查看到的全都是nan cac ...
- Alpha冲刺(6/10)——2019.4.29
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(6/10)--2019.4.29 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- agentzh 的 Nginx 教程(版本 2019.07.31)
agentzh 的 Nginx 教程(版本 2019.07.31) agentzh 的 Nginx 教程(版本 2019.07.31) https://openresty.org/download/a ...
随机推荐
- 终于明白六大类UML类图关系了
UML,全称Unified Modeling Language,统一建模语言.而UML图分为用例图.类图.对象图.状态图.活动图.时序图.协作图.构件图.部署图等9种图. 在面向对象语言中,我们经常看 ...
- CCF 2016-12-1 工资计算
CCF 2016-12-1 工资计算 题目 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交 ...
- MSMQ消息加密
证书实现非对称加密/解密的代码如下 //非对称加密密钥 static byte[] RSAEncrypt(byte[] enkey, X509Certificate2 Certificate) { R ...
- 【转载】ASP.NET网站选购阿里云服务器的时候,阿里云账号个人认证以及企业认证有何不同
在采购阿里云产品,如阿里云云服务器.阿里云短信包.阿里云数据库MySql以及Sqlserver.阿里云对象存储OSS等云产品的时候,如果账号未进行实名认证,很多时候会要求实名认证操作,在实名认证时可选 ...
- Python学习日记(十八) 序列化模块
什么是序列? 就是每一个元素被有序的排成一列 什么是序列化? 就是将原本的列表.字典等内容转化成字符串的过程 什么时候会用到序列化? 数据存储(把数据放在文件.数据库),网络传输等 序列化的目的 1. ...
- Python学习日记(十五) collections模块
在内置函数(dict.list.set.tuple)的基础上,collections模块还提供了几个其他的数据类型:Counter.deque.defaultdict.namedtuple和Order ...
- RabbitMQ java 原生代码
rabbitMQ 的交换器有四种类型:direct.fanout.topic.headers 以下是具体的代码: direct:路由键只能全部匹配,才能进入到指定队列中.其他使用 direct生产者 ...
- ubuntu下关于profile和bashrc中环境变量的理解(转)
ubuntu下关于profile和bashrc中环境变量的理解(转) (0) 写在前面 有些名词可能需要解释一下.(也可以先不看这一节,在后面看到有疑惑再上来看相关解释) $PS1和交互式运行(r ...
- 使用virtualbox安装unbuntu开启共享文件夹时遇到的权限问题
在安装完虚拟机之后,开启文件夹共享,发现只能用root进行访问,个人帐号无权限: cust@hqjia-desktop:/media$ ll drwxr-xr-x 4 root root 4096 2 ...
- SpringCloud2.0 Turbine 断路器集群监控 基础教程(九)
1.启动基础工程 1.1.启动[服务中心]集群,工程名称:springcloud-eureka-server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) ...