[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 ...
随机推荐
- 【SQL Server数据迁移】64位的机器:SQL Server中查询ORACLE的数据
从SQL Server中查询ORACLE中的数据,可以在SQL Server中创建到ORACLE的链接服务器来实现的,但是根据32位 .64位的机器和软件, 需要用不同的驱动程序来实现. 在64位的机 ...
- 微信小程序自定义组件,提示组件
微信小程序自定义组件,这里列举了一个常用的提示自定义组件,调用自定义组件中的方法和字段.仅供参考和学习. 编写组件: 在根目录下添加“components”目录,然后像添加Page页面一样添加自定义组 ...
- php ajax生成excel并下载
目标:使用php,通过ajax请求的方式生成一个excel,然后下载. 思路:大致思路是发送一个ajax请求到后台,后台php处理后生成一个excel文件,然后把生成的文件放到一个临时目录,然后把文件 ...
- PHP7预编译mysqli查询操作
//连接数据库 $mysqli = new mysqli("localhost", "root", "root", "mobile ...
- Qt 添加程序图标和系统托盘图标
添加程序图标 第一种方法: 1.创建程序的时候,选择添加默认图标 2.替换程序目录下的ico文件,编译生成即可. 第二种方法: 比较适合一开始没有添加程序图标的情况 1.项目右键-->添加--& ...
- git stash 缓存本地修改 简介
当我们在使用git的时候,又是会有这种情况:当新的需求了的时候.我们需要为此需求新建一个分支,再次分支上进行修改,当经过测试,提交代码时,在将其合并到主分支,或生产分支上. 但是有时候也有失误的时候, ...
- Python学习日记(二十四) 继承
继承 什么是继承?就是一个派生类(derived class)继承基类(base class)的字段和方法.一个类可以被多个类继承;在python中,一个类可以继承多个类. 父类可以称为基类和超类,而 ...
- javascript_19-DOM初体验
DOM DOM: 文档对象模型(Document Object Model),又称为文档树模型.是一套操作HTML和XML文档的API. DOM可以把HTML和XML描述为一个文档树.树上的每一个分支 ...
- 码云和Git使用说明
Git下载网站: https://git-scm.com/download/win 码云网站 :https://gitee.com 下载Git,并一路下一步安装. 鼠标空白处右键点击,出现两个 ...
- 22,Django常用命令
学习Django你需要了解常见命令的使用,比如创建项目,创建应用,创建超级用户,数据表创建及更新,启动服务器等.这些命令都包含在django-admin.py和manage.py里.除此以外manag ...