hdu3585 二分最大团(dp优化)
题意
给你一些点( <= 50),让你找到k个点,使得他们之间的最小距离最大。
思路:
求最小的最大,我们可以直接二分去枚举距离,但是要注意,不要去二分double找距离,要知道,最后的答案肯定是其中某个点的两点距离,所以我们直接把所有点的距离求出来,放一个数组里面,然后sort下,然后去二分这个数组的下标,根据下标找距离,这样可以节省点时间(这种情况这针对于某些题目,如果点非常多,n*(n-1)/2距离的种类是有可能很多,这样还不如直接二分double快点,毕竟二分是log级别的),二分的时候我们可以根据最大团来判断当前最大团是否大于等于k,来看当前距离是不是满足要求,在简单说一下在这个题目里用最大团要注意的东西,首先最大团是NP问题,求他是很费时间的,平时我常用的就是搜索+dp优化,hdu1530是模板题目,我自己看了最大团的思路后直接自己模拟一个4000+ms
AC了,但是在这个题目里,直接各种TLE,因为自己模拟的那个没有dp优化,做这个题目必须dp优化,不然会死的很惨。还有就是有的人看到最大团,或者最大独立集元素个数就直接想着用 二分匹配去做(之前我就是)但是大家一直忽略了一个问题,就是二分匹配的前提是题目给的是二分图,大家经常忽略了题目给的是不是二分图,而直接套定义所以会直接 一遍匈牙利 然后各种wa。二分图的最大团,或者最大独立集可以 匈牙利 但是不是二分图的就直接是 NP问题,就只能用本方法去壳,但要记得dp优化什么的。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm> #define N 60
using namespace std; typedef struct
{
double x ,y;
}NODE; NODE node[N];
int n ,k ,Ans;
int map[N][N] ,now[N];
int dp[N];
double dis[N][N] ,num[N*N]; void DFS(int x ,int sum)
{
if(sum > Ans) Ans = sum;
if(Ans >= k) return; int able = 0;
for(int i = x + 1 ;i <= n ;i ++)
if(now[i]) able ++;
if(able + sum <= Ans) return; int tnow[N];
for(int i = x + 1 ;i <= n ;i ++)
tnow[i] = now[i]; for(int i = x + 1 ;i <= n ;i ++)
{
if(!tnow[i]) continue;
if(dp[i] + sum <= Ans) continue;
for(int j = x + 1 ;j <= n ;j ++)
now[j] = tnow[j] & map[i][j];
DFS(i ,sum + 1);
}
} int jude(int mid)
{
for(int i = 1 ;i <= n ;i ++)
for(int j = i + 1 ;j <= n ;j ++)
if(num[mid] <= dis[i][j])
map[i][j] = map[j][i] = 1;
else map[i][j] = map[j][i] = 0; Ans = dp[n] = 1;
for(int i = n - 1 ;i >= 1 ;i --)
{
for(int j = 1 ;j <= n ;j ++)
now[j] = map[i][j];
DFS(i ,1);
dp[i] = Ans;
if(Ans >= k) return 1;
}
return 0;
} double get_dis(NODE a ,NODE b)
{
double x = (a.x - b.x) * (a.x - b.x);
double y = (a.y - b.y) * (a.y - b.y);
return sqrt(x + y);
} int main ()
{
int i ,j ,t;
while(~scanf("%d %d" ,&n ,&k))
{
for(i = 1 ;i <= n ;i ++)
scanf("%lf %lf" ,&node[i].x ,&node[i].y);
for(t = 0 ,i = 1 ;i <= n ;i ++)
{
for(j = i + 1 ;j <= n ;j ++)
{
dis[i][j] = dis[j][i] = get_dis(node[i] ,node[j]);
num[++t] = dis[i][j];
}
dis[i][i] = 0;
}
sort(num + 1 ,num + t + 1);
int low = 1 ,up = t ,mid ,ans =1;
while(low <= up)
{
mid = (low + up) >> 1;
if(jude(mid))
{
low = mid + 1;
ans = mid;
}
else
up = mid - 1;
}
printf("%.2lf\n" ,num[ans]);
}
return 0;
}
hdu3585 二分最大团(dp优化)的更多相关文章
- bzoj 1044 [HAOI2008]木棍分割(二分+贪心,DP+优化)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1044 [题意] n根木棍拼到一起,最多可以切m刀,问切成后最大段的最小值及其方案数. ...
- [CTSC2012]熟悉的文章(广义后缀自动机+二分答案+单调队列优化DP)
我们对作文库建出广义后缀自动机.考虑用\(SAM\)处理出来一个数组\(mx[i]\),表示从作文的第\(i\)个位置向左最远在作文库中出现的子串的长度.这个东西可以在\(SAM\)上跑\(trans ...
- HDU 3586 二分答案+树形DP判定
HDU 3586 『Link』HDU 3586 『Type』二分答案+树形DP判定 ✡Problem: 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏 ...
- dp优化1——sgq(单调队列)
该文是对dp的提高(并非是dp入门,dp入门者请先参考其他文章) 有时候dp的复杂度也有点大...会被卡. 这几次blog大多数会讲dp优化. 回归noip2017PJT4.(题目可以自己去百度).就 ...
- loj6171/bzoj4899 记忆的轮廊(期望dp+优化)
题目: https://loj.ac/problem/6171 分析: 设dp[i][j]表示从第i个点出发(正确节点),还可以有j个存档点(在i点使用一个存档机会),走到终点n的期望步数 那么 a[ ...
- 常见的DP优化类型
常见的DP优化类型 1单调队列直接优化 如果a[i]单调增的话,显然可以用减单调队列直接存f[j]进行优化. 2斜率不等式 即实现转移方程中的i,j分离.b单调减,a单调增(可选). 令: 在队首,如 ...
- 【学习笔记】动态规划—各种 DP 优化
[学习笔记]动态规划-各种 DP 优化 [大前言] 个人认为贪心,\(dp\) 是最难的,每次遇到题完全不知道该怎么办,看了题解后又瞬间恍然大悟(TAT).这篇文章也是花了我差不多一个月时间才全部完成 ...
- [总结]一些 DP 优化方法
目录 注意本文未完结 写在前面 矩阵快速幂优化 前缀和优化 two-pointer 优化 决策单调性对一类 1D/1D DP 的优化 \(w(i,j)\) 只含 \(i\) 和 \(j\) 的项--单 ...
- DP 优化方法大杂烩 & 做题记录 I.
标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...
随机推荐
- 【转载】快速理解android View的测量onMeasure()与MeasureSpec
笔者之前有一篇文章已经使用onMeasure()解决了listview与scollview的显示冲突问题,博客地址如下: onMeasure简单方法 完美解决ListView与ScollView冲突问 ...
- 阅读源码,HashMap回顾
目录 回顾 HashMap简介 类签名 常量 变量 构造方法 tableSizeFor方法 添加元素 putVal方法 获取元素 getNode方法 总结 本文一是总结前面两种集合,补充一些遗漏,再者 ...
- web服务器-并发服务器2
阅读目录 1.Web静态服务器-5-非堵塞模式 2.Web静态服务器-6-epoll 3.Web静态服务器-7-gevent版 4.知识扩展-C10K问题 一.Web静态服务器-5-非堵塞模式 单进程 ...
- 通达OA 任意文件上传-2013/2015版本
参考 http://wiki.0-sec.org/0day/%E9%80%9A%E8%BE%BEoa/11.html 影响版本 2013版本 2015版本 漏洞文件 general/vmeet/wbU ...
- linux时间问题
如果遇到创建时间和更新时间,不一致,先将时间调整为一致. 导致不一致的原因可能是时区不对,使用 tzselect ,将时区调整为Asia/Shanghai , cp /usr/share/zonein ...
- 追洞小组 | fastjson1.2.24复现+分析
出品|MS08067实验室(www.ms08067.com) 本文作者:爱吃芝士的小葵(Ms08067实验室追洞小组成员) 1.靶场搭建 2.漏洞复现 3.漏洞分析 4.漏洞修复 5.心得 靶场搭建 ...
- find文本处理(locate)实例学习记录
find文本处理(locate)实例学习记录 (一)按文件名称查找 按照文件名称查找是 find 最常见的用法,需要注意的是,搜索的文件名必须完全匹配,才能找到对应的文件. 1. 查找当前目录下所有 ...
- Anchor-Free总结
目录 Anchor-Free综述 一. CornerNet 1.1 概述 1.2 模块介绍 1.2.1 Heatmap 1.2.2 Offset 1.2.3 Grouping Corners 1.2. ...
- 爬虫-使用BeautifulSoup4(bs4)解析html数据
Beautiful Soup 是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. 一.安装 sudo pip3 install beautifulsoup4 二.使 ...
- java例题_40 字母字符串转数组后排序
1 /*40 [程序 40 字符串排序] 输入一个字符串数组,按照字母表的降序对这些字符串进行排序. 2 题目:字符串排序. 3 */ 4 5 /*分析 6 * 1.从键盘得到一个纯字母的字符串 7 ...