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 方案 ...
随机推荐
- POJ-1797(最短路变形-dijkstra)
Heavy Transportation POJ-1797 这题是最短路题型的变形,该题不是求起点到终点的最短路,而是求路径中的最小边的最大值. 这题的求解思路是:将原来dijkstra中的松弛方程改 ...
- C++高精度计算(大整数类)
Java和Pathon可以不用往下看了 C++的基本数据类型中,范围最大的数据类型不同编译器不同,但是最大的整数范围只有[-2^63-2^63-1](对应8个字节所对应的二进制数大小).但是对于某些需 ...
- 记客户端WebBrowser控件修改版本的问题
保留在本地电脑的一篇记录,第二条描述是在网上看来的,忘记在哪看的了,也就没注明出处,望见谅. 1.Winform内置浏览器控件的底层调用与系统IE浏览器的底层调用相同. 2.IE8 对渲染引擎做了很大 ...
- MyBatis(七):MyBatis缓存详解(一级缓存/二级缓存)
一级缓存 MyBatis一级缓存上SqlSession缓存,即在统一SqlSession中,在不执行增删改操作提交事务的前提下,对同一条数据进行多次查询时,第一次查询从数据库中查询,完成后会存入缓 ...
- 基于Docker的MindSpore安装与使用基础介绍
技术背景 MindSpore是一款新一代AI开源计算框架,其特色在于:创新编程范式,AI科学家和工程师更易使用,便于开放式创新:该计算框架可满足终端.边缘计算.云全场景需求,能更好保护数据隐私:可开源 ...
- 再探循环依赖 → Spring 是如何判定原型循环依赖和构造方法循环依赖的?
开心一刻 一天,侄子和我哥聊天,我坐在旁边听着 侄子:爸爸,你爱我妈妈吗? 哥:这话说的,不爱能有你吗? 侄子:确定有我不是因为荷尔蒙吗? 哥:因为什么荷尔蒙,因为爱情! 侄子:那我妈花点钱,你咋老说 ...
- jQuery学习笔记(2) jQuery选择器
jQuery的选择器完全继承了CSS的风格,利用jQuery选择器,可以非常便捷和快速地找出特定的DOM元素,然后为它们添加相应的行为. 目录 目录 CSS选择器 jQuery选择器 jQuery选 ...
- python-实现顺序栈
7 class sqstack(object): 8 def __init__(self,maxsize): 9 self.maxsize = maxsize 10 self.stackElem = ...
- POJ1562_Oil Deposits(JAVA语言)
思路:bfs.水题,标记下计数就完了. Oil Deposits Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22928 ...
- kong更改日志格式
基于业务的需求,需要对网关层的日志进行适当定制,以满足使用kibana的制图. 对于kong的日志格式更改,可查看到的资料都过于繁琐,特此记录. 修改kong的日志格式 # ctl edit depl ...