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 方案 ...
随机推荐
- 小程序基于Token登录 示意图
- Lua生成Guid(uuid)
全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) .GUID是一种由算法生成的二进制长度为 ...
- 2020年HTML5考试模拟题整理(二)
1.以下是HTML5新增的标签是: AA.<aside>B.<isindex> C. <samp>D.<s>2.以下不是HTML5的新增的标签是: BA ...
- 如何在 ASP.Net Core 中使用 Serilog
记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...
- PTE准备的时候,用英式英语还是美式英语
我自己是按照英式英语准备的,因为PTE的题目都是英式拼写,考生在做SWT题目的时候往往会抄原文中的句子或者关键词,不自觉地就将第一个区分点写成英式的,所以后面再用美式的就会被判错. PTE写作的小分中 ...
- python报错:AttributeError: module 'pdb' has no attribute 'set_trace'
在第一次使用python中的pdb模块式,pdb.set_trace()时编译器总是会报错,一开始总是以为是自己的拼写错误,但经过反复检查后发现并不是自己的拼写错误.而是我创建的测试文件的名称是pdb ...
- 2019第十届蓝桥杯省赛及国赛个人总结(java-B组)
省赛: 今年省赛的题目比18年简单的多,基本都是暴力枚举.BFS之类.还记得去年在山师考蓝桥杯,我这种辣鸡连题目都没看懂.本以为蓝桥会变得越来越难,没想到今年就被打脸了.今年省赛后面三个编程大题一个没 ...
- 习题3_08循环小数(JAVA语言)
package 第三章习题; import java.util.Arrays; import java.util.Scanner; /* * 输入整数a和b(0<=a<=3000,1&l ...
- 获得PyInstaller打包exe的py源码
参考链接:https://laucyun.com/33359ed9f725529ac9b606d054c8459d.html way1:pyi-archive_viewer 提取pyc,uncomp ...
- (二)SpringBoot启动过程的分析-环境信息准备
-- 以下内容均基于2.1.8.RELEASE版本 由上一篇SpringBoot基本启动过程的分析可以发现在run方法内部启动SpringBoot应用时采用多个步骤来实现,本文记录启动的第二个环节:环 ...