灵魂宝石 bzoj 2663
灵魂宝石
【问题描述】
“作为你们本体的灵魂,为了能够更好的运用魔法,被赋予了既小巧又安全的外形”
我们知道,魔法少女的生命被存放于一个称为灵魂宝石(Soul Gem)的装置内。而有时,当灵魂宝石与躯体的距离较远时,魔法少女就无法控制自己的躯体了。在传说中,魔法少女Abel仅通过推理就得到了这个现象的一般法则,被称为Abel定理:存在宇宙常量R(是一个非负实数,或正无穷),被称为灵魂宝石常量,量纲为空间度量(即:长度)。如果某个魔法少女的灵魂宝石与她的躯体的距离严格超过R,则她一定无法控制自己的躯体;如果这个距离严格小于R,则她一定可以控制自己的躯体。(这里的距离指平面的 Euclid距离。)
注意:该定理不能预言距离刚好为R的情形。可能存在魔法少女A和B,她们离自己的灵魂宝石的距离都恰好为R,但是A可以控制自己的躯体,而B不可以。
现在这个世界上再也没有魔法少女了,但是我们却对这个宇宙常量感兴趣。我们只能通过之前的世界遗留下来的数据来确定这个常量的范围了。
每一组数据包含以下信息:
一共有N个魔法少女及她们的灵魂宝石,分别编号为1-N。
这N个魔法少女所在的位置是(Xi, Yi)。
这N个灵魂宝石所在的位置是(xi, yi)。
此时恰好有 K个魔法少女能够控制自己的躯体。
1.我们认为这个世界是二维的 Euclid 空间。
2.魔法少女与灵魂宝石之间的对应关系是未知的。
3.我们不知道是具体是哪 K个魔法少女能够控制自己的躯体。
根据以上信息,你需要确定灵魂宝石常量 R可能的最小值 Rmin 和最大值Rmax。
【输入格式】
第一行包两个整数:N、K。
接下来N行,每行包含两个整数:Xi,Yi,由空格隔开。
再接下来N行,每行包含两个整数:xi,yi,由空格隔开。
【输出格式】
输出两个量:Rmin、Rmax,中间用空格隔开。
Rmin 一定是一个非负实数,四舍五入到小数点后两位。
Rmax 可能是非负实数,或者是正无穷:
如果是非负实数,四舍五入到小数点后两位;
如果是正无穷,输出“+INF”(不包含引号)。
【输入样例】
2 1
1 0
4 0
0 0
4 4
【输出样例】
1.00 5.00
【数据范围】
对于100%的数据:
1 ≤ N ≤ 50,0 ≤ K ≤ N,-1000 ≤ xi,yi,Xi,Yi ≤ 1000。
题解:
题意:对于n个人与n个宝石,每个人需要各自匹配一1颗与其距离小于k的宝石,距离等于k的宝石可以自由选择是否匹配,求k的最小值与最大值
那么最小值可以很容易想到二分,连接所有距离小于k的边,用二分图匹配检验,则为用最大匹配数求最小值
然而最大值并不能直接像最小值一样求解,因为二分图求的是最大匹配,这一点模拟样例就可以得到
于是考虑一点小小的转化
最大值的检验中,我们将距离大于等于k的边相连
那么二分图匹配跑出的结果就是最大不匹配数
总个数减去最大不匹配数即为最小匹配数
利用最小匹配数就能求出最大值
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
struct shape
{
double x, y;
};
int n, k;
double l, r;
double ans;
int my[];
shape a[];
bool vis[];
int tot, to[], nex[], fir[];
inline double Dis(shape x, shape y)
{
return sqrt((x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y));
}
inline void Ins(int x, int y)
{
nex[++tot] = fir[x];
fir[x] = tot;
to[tot] = y;
}
bool Find(int u)
{
for(int i = fir[u]; i; i = nex[i])
{
int v = to[i];
if(!vis[v])
{
vis[v] = true;
if(!my[v] || Find(my[v]))
{
my[v] = u;
return true;
}
}
}
return false;
}
inline bool Checkmi(double x)
{
tot = ;
for(int i = ; i <= n; ++i) my[i + n] = fir[i] = ;
for(int i = ; i <= n; ++i)
for(int j = n + ; j <= n + n; ++j)
if(Dis(a[i], a[j]) <= x)
Ins(i, j);
int sum = ;
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= n; ++j)
vis[j + n] = false;
if(Find(i)) ++sum;
}
if(sum < k) return true;
return false;
}
inline bool Checkma(double x)
{
tot = ;
for(int i = ; i <= n; ++i) my[i + n] = fir[i] = ;
for(int i = ; i <= n; ++i)
for(int j = n + ; j <= n + n; ++j)
if(Dis(a[i], a[j]) >= x)
Ins(i, j);
int sum = ;
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= n; ++j)
vis[j + n] = false;
if(Find(i)) ++sum;
}
if(sum < n - k) return false;
return true;
}
int main()
{
// freopen("soulgem.in", "r", stdin), freopen("soulgem.out", "w", stdout);
scanf("%d%d", &n, &k);
for(int i = ; i <= n + n; ++i)
scanf("%lf %lf", &a[i].x, &a[i].y);
l = , r = ;
for(int i = ; i <= ; ++i)
{
double mi = (l + r) / 2.0;
if(Checkmi(mi)) l = mi;
else ans = mi, r = mi;
}
printf("%.2lf ", ans);
ans = ;
l = , r = ;
for(int i = ; i <= ; ++i)
{
double mi = (l + r) / 2.0;
if(Checkma(mi)) ans = mi, l = mi;
else r = mi;
}
if(fabs(ans - ) <= 0.001) printf("+INF");
else printf("%.2lf", ans);
}
灵魂宝石 bzoj 2663的更多相关文章
- BZOJ 2663: [Beijing wc2012]灵魂宝石
2663: [Beijing wc2012]灵魂宝石 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 261 Solved: 108[Submit][S ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj2663: [Beijing wc2012]灵魂宝石(二分+匈牙利)
2663: [Beijing wc2012]灵魂宝石 题目:传送门 题解: 又是一道卡精度的题目. 很容易就可以看出单调性啊,如果R越大,选的人就越多,R越小,选的人就越少. 那最小值就直接搞咯. 那 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
随机推荐
- ASP.NET Core 中间件之压缩、缓存
前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是 Microsoft.AspNetCore.Respons ...
- 【原】Github+Hexo+NextT搭建个人博客
摘要 GitHub 是一个开源项目的托管网站,相信很多人都听过.在上面有很多高质量的项目代码,我们也可以把自己的项目代码托管到GitHub,与朋友们共享交流.GitHub Pages 是Github为 ...
- C# Excel导入、导出【源码下载】
本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...
- 深入理解MySql子查询IN的执行和优化
IN为什么慢? 在应用程序中使用子查询后,SQL语句的查询性能变得非常糟糕.例如: SELECT driver_id FROM driver where driver_id in (SELECT dr ...
- 深入理解 Java G1 垃圾收集器--转
原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单 ...
- Oracle数据库该如何着手优化一个SQL
这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...
- jq选择器基础
Jquery $代表选择器 使用jq必须要导入jq文件 <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js&qu ...
- Maven搭建SpringMVC+Hibernate项目详解 【转】
前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...
- iOS - 模态Model视图跳转和Push视图跳转的混合需求实现原理
在研发中总会遇到一些莫名的需求,本着存在即合理的态度跟大家分享一下"模态Model视图跳转和Push视图跳转的需求实现",本文仅仅传授研发技术不传授产品以及UE的思想,请大家合理对 ...
- MySQL数据库罕见的BUG——Can't get hostname for your address
在连接mysql jdbc时候,抛出了 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communicat ...