cf 320# A Problem about Polyline (二分)

来源:互联网 发布:java文件中文乱码 编辑:程序博客网 时间:2024/04/27 06:17

题目: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;elsedown=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;}

0 0
原创粉丝点击