【二分答案】【DFS】【分类讨论】Gym - 100851F - Froggy Ford
题意:河里有n块石头,一只青蛙要从左岸跳到右岸,你可以再在任意一个位置放一块石头,使得在最优方案下,青蛙单步跳的距离的最大值最小化,输出该位置。
将原图视作完全图,二分答案mid,然后在图中只保留小于等于mid的边,分别用dfs处理左岸能到哪些石头,右岸能到哪些石头。然后二重循环枚举两侧这些点对,如果存在一对点,它们的距离不超过2*mid,那么mid可行,将石头放在它们的中点即可。否则不可行。
要注意,左岸和右岸也需要当成点,不过距离计算时会稍微麻烦一点,需要讨论一下。
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const double EPS=0.001;
struct Point{
ll x,y;
Point(const ll &x,const ll &y){
this->x=x;
this->y=y;
}
Point(){}
double length(){
return sqrt((double)x*(double)x+(double)y*(double)y);
}
void read(){
scanf("%lld%lld",&x,&y);
}
}p[1005];
typedef Point Vector;
Vector operator - (const Point &a,const Point &b){
return Vector(a.x-b.x,a.y-b.y);
}
int n,m;
double dis(int i,int j){
if(i==0 && j==0 || i==m+1 && j==m+1){
return 0.0;
}
if(i==0 && j==m+1 || i==m+1 && j==0){
return (double)n;
}
if(i==0){
return (double)p[j].x;
}
if(j==0){
return (double)p[i].x;
}
if(i==m+1){
return (double)(n-p[j].x);
}
if(j==m+1){
return (double)(n-p[i].x);
}
return (p[i]-p[j]).length();
}
double mid;
bool can[2][1005];
void dfs(int U){
can[0][U]=1;
for(int i=1;i<=m;++i){
if(!can[0][i] && dis(U,i)-mid<EPS){
dfs(i);
}
}
}
void df2(int U){
can[1][U]=1;
for(int i=1;i<=m;++i){
if(!can[1][i] && dis(U,i)-mid<EPS){
df2(i);
}
}
}
int main(){
freopen("froggy.in","r",stdin);
freopen("froggy.out","w",stdout);
scanf("%d%d",&n,&m);
if(m==0){
printf("%.3f %.3f\n",(double)n*0.5,1.0);
return 0;
}
for(int i=1;i<=m;++i){
p[i].read();
}
double l=0.0,r=(double)n;
double anx,any;
while(r-l>EPS){
memset(can,0,sizeof(can));
mid=(l+r)*0.5;
dfs(0);
df2(m+1);
bool flag=0;
for(int i=0;i<=m+1;++i){
bool ok=0;
for(int j=0;j<=m+1;++j){
if(can[0][i] && can[1][j] && dis(i,j)-2.0*mid<EPS){
ok=1;
if(i==0 && j==m+1 || i==m+1 && j==0){
anx=(double)n*0.5;
any=1.0;
}
else if(i==0 && j==0){
continue;
}
else if(i==m+1 && j==m+1){
anx=(double)n;
any=0.0;
}
else if(i==0){
anx=(double)p[j].x*0.5;
any=(double)p[j].y;
}
else if(j==0){
anx=(double)p[i].x*0.5;
any=(double)p[i].y;
}
else if(i==m+1){
anx=(double)(p[j].x+n)*0.5;
any=(double)p[j].y;
}
else if(j==m+1){
anx=(double)(p[i].x+n)*0.5;
any=(double)p[i].y;
}
else{
anx=(double)(p[i].x+p[j].x)*0.5;
any=(double)(p[i].y+p[j].y)*0.5;
}
break;
}
}
if(ok){
flag=1;
break;
}
}
if(flag){
r=mid;
}
else{
l=mid+EPS;
}
}
printf("%.3f %.3f\n",anx,any);
return 0;
}
【二分答案】【DFS】【分类讨论】Gym - 100851F - Froggy Ford的更多相关文章
- Gym - 100851F Froggy Ford kruskal
题目链接: http://acm.hust.edu.cn/vjudge/problem/307216 Froggy Ford Time Limit: 3000MS 题意 青蛙过河,河中有若干个石头,现 ...
- Gym - 100851F - Froggy Ford(dijkstra)
题目链接 参考 http://blog.csdn.net/KIJamesQi/article/details/52214990 题意 蛤蛤要从这岸去到对岸,河中有n块石头,现可以在河中添加一块石头 ...
- CH Round #72树洞[二分答案 DFS&&BFS]
树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...
- BZOJ 1486: [HNOI2009]最小圈( 二分答案 + dfs判负圈 )
二分答案m, 然后全部边权减掉m, 假如存在负圈, 那么说明有平均值更小的圈存在. 负圈用dfs判断. ------------------------------------------------ ...
- dp+分类讨论 Gym 101128E
题目链接:http://codeforces.com/gym/101128 感觉这个人写的不错的(我只看了题目大意):http://blog.csdn.net/v5zsq/article/detail ...
- [BZOJ 1486][HNOI2009]最小圈(二分答案+dfs写的spfa判负环)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1486 分析:容易想到先二分答案x,然后把所有边的权值-x,那么如果图中存在权值和为0的 ...
- 【树链剖分】【dfs序】【LCA】【分类讨论】Codeforces Round #425 (Div. 2) D. Misha, Grisha and Underground
一棵树,q次询问,每次给你三个点a b c,让你把它们选做s f t,问你把s到f +1后,询问f到t的和,然后可能的最大值是多少. 最无脑的想法是链剖线段树……但是会TLE. LCT一样无脑,但是少 ...
- 【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]
Shik and Travel Time Limit: 50 Sec Memory Limit: 512 MB Description 给定一棵n个点的树,保证一个点出度为2/0. 遍历一遍,要求每 ...
- Gym - 101908G 二分答案+最大流
After the end of the truck drivers' strike, you and the rest of Nlogônia logistics specialists now h ...
随机推荐
- 【leetcode 简单】第三十四题 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...
- 天梯赛 L2-005 集合相似度 (set容器)
给定两个整数集合,它们的相似度定义为:Nc/Nt*100%.其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数.你的任务就是计算任意一对给定集合的相似度. 输入格式: 输 ...
- Git HTTPS 方式自动保存用户名密码
一行命令搞定: git config --global credential.helper wincred 第一次输入用户名和密码提交,第二次就不需要了 参考: https://help.github ...
- Pyrhon代码的中文问题
解决代码中出现中文乱码的问题: 使用中文需要在第一行声明编码#encoding=utf-8 或者#coding=utf-8 python只检查#.coding和编码字符串,所以你可能回见到下面的声明方 ...
- Power Profiles for Android
http://source.android.com/devices/tech/power.html Battery usage information is derived from battery ...
- 64_q2
qt3-3.3.8b-69.fc26.x86_64.rpm 13-Feb-2017 01:37 3591906 qt3-MySQL-3.3.8b-69.fc26.i686.rpm 13-Feb-201 ...
- Python中如何Debug
debug是编码是非常重要的调试技巧,通过在运行过程中设置断点,帮助开发人员更好的理解运行过程. Python中debug不像JAVA或者C++那样在IDE中设置断点那么直观. Python的debu ...
- Java杂知识汇总(自己积累的)
[前提] 接下来,可能需要开始学习Java了,所以现在将前辈们传递给我的经验都记录下来,免得再次问他们. [积累] 1. 关于重启Tomcat服务器: 当在开发过程中, | 修改Java代码 -- 需 ...
- TCP可靠传输和拥塞控制
1.TCP的可靠传输 tcp的可靠传输主要靠 来自接收方的确认报文 和 超时重传. 发出报文,计时器开始计时,在规定超时时间内未收到确认报文则重新发送. 注意:发送报文都留一个副本,如果收到确认报文就 ...
- C++的黑科技(深入探索C++对象模型)
周二面了腾讯,之前只投了TST内推,貌似就是TST面试了 其中有一个问题,“如何产生一个不能被继承的类”,这道题我反反复复只想到,将父类的构造函数私有,让子类不能调用,最后归结出一个单例模式,但面试官 ...