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 方案 ...
随机推荐
- python graphviz的使用(画图工具)
参考文章1 参考文章2 一.graphviz安装及配置 graphviz实际上是一个绘图工具,可以根据dot脚本画出树形图等. 1.windows安装 安装graphviz软件:https://gra ...
- Mybatis中由于${}直接注入引发的问题
一.问题引入 我们先来看这段代码,我想从取值为${category}的表中查询全部信息. @Mapper public interface CategoryMapper { @Select(" ...
- MarkDown-简单学习
标题 注意:首部添加1-6个"#"号来设置标题大小: 字体 1:粗体 (注意:首尾同时添加2个"*"号来设置) 2:斜体 (注意:首尾同时添加1个"* ...
- 【linux】驱动-8-一文解决设备树
目录 前言 8. Linux设备树 8.1 设备树简介 8.2 设备树框架 8.2.1 设备树格式 8.2.1.1 DTS 文件布局 8.2.1.2 node 格式 8.2.1.3 propertie ...
- 理解的shell父子关系
今天我们谈谈linux系统的shell的父子关系,因为大家对手机都比较熟悉,手机本身也是一个linux主机,所以我们今天就拿手机来举个例子. 首先就是创建一个新的shell,你可以把它理解成一个手机打 ...
- 原生对象写法,dom调用方法
1 var App = (function () { 2 var App = function () { 3 //全局变量 4 this.init(); 5 this.a = ...
- [Fundamental of Power Electronics]-PART I-4.开关实现-4.3 开关损耗/4.4 小结
4.3 开关损耗/4.4 小结 使用半导体器件实现开关后,我们现在可以讨论变换器中损耗和低效的另一个主要来源:开关损耗.如前所述,半导体器件的导通和关断转换需要几十纳秒到几微秒的时间.在这些开关转换期 ...
- lms框架分布式事务使用简介
lms框架的分布式事务解决方案采用的TCC事务模型.在开发过程中参考和借鉴了hmily.使用AOP的编程思想,在rpc通信过程中通过拦截器的方式对全局事务或是分支事务进行管理和协调. 本文通过lms. ...
- 2021年春软件工程"助教团队"成员介绍
2021年春软件工程 助教团队 成员介绍 项目 内容 这个作业属于那个课程 2021春季学期软件工程(罗杰.任健) 这个作业的要求在哪里 团队介绍 姓名 照片 个人介绍 分工 刘Q 本团队的PM,和助 ...
- 软工个人阅读作业2 —— 构建之法与CI/CD
项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人阅读作业#2 我在这个课程的目标是 阅读思考教材,调研软工工具 这个作业在哪个具体方面帮助我实 ...