hdu 4562 dp ***
题意:给出一个点p(X,Y)以及若干圆。从中选出尽可能多的圆满足:圆能且只能包含p或者原点中的一个(不能在圆上);圆之间不能相交或者相切。
链接:点我
用dp求满足条件包含一个点圆的最多数目,然后两个点再求最大的即可
思路:首先分理出只包含原点或者p的圆,然 后分别按照半径升序排序。分别对包含原点和p的进行dp。f1[i]表示包含原点的圆中前i个最多选出多少个。f2[i]表示p的。然后合并。就是枚举 f1的i和f2的j,若这两个圆不冲突,那么就能选出f1[i]+f2[j]个。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define MOD 1000000007
#define pb(a) push_back(a)
const int INF=0x3f3f3f3f;
const double eps=1e-;
typedef long long ll;
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
const int MAXN=;
int dp1[MAXN],dp2[MAXN];
int n,m,tt,cnt;
struct Node
{
int x,y;
int r;
void in()
{
scanf("%d%d%d",&x,&y,&r);
}
}st,ed,node[MAXN],node1[MAXN],node2[MAXN];
int dis(Node a,Node b)
{
return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp(Node a,Node b)
{
return a.r<b.r;
}
int main()
{
int i,j,k;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
int ca=;
scanf("%d",&tt);
int X,Y;
st.x=,st.y=;
while(tt--)
{
scanf("%d%d%d",&n,&X,&Y);
ed.x=X,ed.y=Y;
int tot1=,tot2=;
for(i=;i<n;i++)
{
node[i].in();
int d1=dis(st,node[i]);
int d2=dis(ed,node[i]);
if(d1==node[i].r*node[i].r||d2==node[i].r*node[i].r) continue; //点在圆上
if(d1>node[i].r*node[i].r&&d2>node[i].r*node[i].r) continue; //不包含任何点
if((d1<node[i].r*node[i].r)&&(d2<node[i].r*node[i].r)) continue; //两个点都包含
if(d1<node[i].r*node[i].r)
{
node1[tot1++]=node[i];
}
else node2[tot2++]=node[i];
}
cl(dp1);
cl(dp2);
sort(node1,node1+tot1,cmp);
sort(node2,node2+tot2,cmp);
int ans1=,ans2=;
for(i=;i<tot1;i++)
{
dp1[i]=;
for(j=;j<i;j++)
{
if(node1[i].r==node1[j].r) continue;
int d=dis(node1[i],node1[j]);
if(d<(node1[i].r-node1[j].r)*(node1[i].r-node1[j].r))
{
dp1[i]=max(dp1[i],dp1[j]+);
}
}
ans1=max(ans1,dp1[i]);
}
for(i=;i<tot2;i++)
{
dp2[i]=;
for(j=;j<i;j++)
{
if(node2[i].r==node2[j].r) continue;
int d=dis(node2[i],node2[j]);
if(d<(node2[i].r-node2[j].r)*(node2[i].r-node2[j].r))
{
dp2[i]=max(dp2[i],dp2[j]+);
}
}
ans2=max(ans2,dp2[i]);
}
int ans=max(ans1,ans2);
for(i=;i<tot1;i++)
{
for(j=;j<tot2;j++)
{
int d=dis(node1[i],node2[j]);
if(d>(node1[i].r+node2[j].r)*(node1[i].r+node2[j].r))
ans=max(ans,dp1[i]+dp2[j]);
}
}
printf("Case %d: %d\n",ca++,ans);
}
}
hdu 4562 dp ***的更多相关文章
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 5928 DP 凸包graham
给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...
- HDU 4562 守护雅典娜(dp)
守护雅典娜 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submi ...
- HDU 4562 守护雅典娜 (计算几何+DP)
守护雅典娜 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submi ...
- HDU 1069 dp最长递增子序列
B - Monkey and Banana Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- HDU 1160 DP最长子序列
G - FatMouse's Speed Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- hdu 4826(dp + 记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4826 思路:dp[x][y][d]表示从方向到达点(x,y)所能得到的最大值,然后就是记忆化了. #i ...
- HDU 2861 (DP+打表)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2861 题目大意:n个位置,m个人,分成k段,统计分法.S(n)=∑nk=0CknFibonacci(k ...
- HDU 2838 (DP+树状数组维护带权排序)
Reference: http://blog.csdn.net/me4546/article/details/6333225 题目链接: http://acm.hdu.edu.cn/showprobl ...
随机推荐
- json字符串和Json对象,以及json的基本了解
考虑到python等语言中没有更好表示json对象的方法,所以使用JavaScript来介绍json 首先是json字符串: var str1 = '{ "name": " ...
- Java环境变量自动配置。嗯,就是用C#去配置JDK
在跟学弟们聊天的过程中,发现一些人在首次接触Java时,对环境变量配置总是很生疏.可能是由于初学,对一些概念没有很深刻的理解.本着助人为乐的精神.我决定帮他们一下.写一个自动配置JDK环境变量的小工具 ...
- mysql先排序在分组
– 表的结构 `test`– CREATE TABLE IF NOT EXISTS `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varcha ...
- 【转】[.Net] 确定当前网站的物理文件路径
确定当前网站的物理文件路径 在应用程序中,您可能需要确定服务器上的文件或其他资源的路径.例如,如果应用程序以编程方式对文本文件进行读写操作,则必须为用于读取和写入的方法提供该文件的完整物理路径. 将物 ...
- charles https抓包 (安卓安装证书)
的Android APP使用的都是http请求,之后改成了https,就出现了以下情况,无法正常读取抓取的内容 下面阐述一下,正确的安装步骤,为出现类似情况的朋友提供一个参考: 1.第一步: 最后点击 ...
- 图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()
https://blog.csdn.net/bigconvience/article/details/26697645 Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向 ...
- java实战
1.http://learning.happymmall.com/ http://www.happymmall.com/index.html 前台官网 http://test.happymmall. ...
- Chrome插件 postman的使用方法详解!最全面的教程
一 简介 Postman 是一款功能超级强大的用于发送 HTTP 请求的 Chrome插件 .做web页面开发和测试的人员应该是无人不晓无人不用!其主要特点 特点: 创建 + 测试:创建和发送任何的H ...
- Online DDL工具的安装与使用
最近经常在线上经常遇到有性能问题的SQL,有些表没有合理添加索引,有些表添加的索引不合理,各种各样的问题,导致SQL的执行效率不高.这时DBA们不得不重构SQL,使其达到最好的性能,这时我们往往要在线 ...
- JS两种事件的触发方式
一.入侵式触发方式 <input type="button" id="one" onclick="事件" /> 二.非入侵式触发 ...