题目:http://codeforces.com/problemset/problem/578/A
题意:给定一种波形 (0, 0) – (x, x) – (2x, 0) – (3x, x) – (4x, 0) – ... - (2kx, 0) – (2kx + x, x) – ....,求出最小的x,使得整点s(a,b)在波形上,不存在x则输出-1。
分析:若存在一点p(2kx,0),使得点p(2kx,0)与点s(a,b)的斜率k=1或者-1,那么就有解,即a+b=2kx或者a-b=2kx,k为整数。然后二分区间就行了。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const double AE = 1e-13;
bool ok(int m1,int m2,double x1,double x2)//x1~x2
{
double p1,p2;
long long t1,t2;
p1=(m1+m2)/(2*x1);
p2=(m1+m2)/(2*x2);
t1=p1=floor(p1+AE);
t2=p2=ceil(p2);
if(t1>=t2)
return true;
p1=(m1-m2)/(2*x1);
p2=(m1-m2)/(2*x2);
t1=p1=floor(p1+AE);
t2=p2=ceil(p2);
if(t1>=t2)
return true;
return false;
}
double Find(int m1,int m2)
{
double ret=1e19,down=m2,up=1e18,mid;
for(int i=0;i<100000;i++)
{
mid=(down+up)/2.0;
if(ok(m1,m2,down,mid))
up=mid;
else
down=mid;
}
return mid;
}
int main()
{
int m1,m2;
scanf("%d%d",&m1,&m2);
if(m1<m2)
{
printf("-1\n");
return 0;
}
double ans=Find(m1,m2);
if(ans>1e17)
{
printf("-1\n");
return 0;
}
printf("%.13lf\n",ans);
return 0;
}