Codeforces 579C A Problem about Polyline【数学啊】【好不擅长啊】

来源:互联网 发布:npm package.json 编辑:程序博客网 时间:2024/05/03 23:28

C. A Problem about Polyline
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

There is a polyline going through points (0, 0) – (x, x) – (2x, 0) – (3x, x) – (4x, 0) – ... - (2kx, 0) – (2kx + x, x) – ....

We know that the polyline passes through the point (a, b). Find minimum positive valuex such that it is true or determine that there is no suchx.

Input

Only one line containing two positive integers a andb (1 ≤ a, b ≤ 109).

Output

Output the only line containing the answer. Your answer will be considered correct if its relative or absolute error doesn't exceed10 - 9. If there is no suchx then output  - 1 as the answer.

Examples
Input
3 1
Output
1.000000000000
Input
1 3
Output
-1
Input
4 1
Output
1.250000000000
Note

You can see following graphs for sample 1 and sample 3.



题目大意:

有一系列周期性折线:(0,0)->(X,X)->(2X,0)->(3X,X)..................

让你寻找一个合法的X,使得X尽可能的小,并且穿过点(A,B);


思路(来源于网络):


首先我们分析,这个点要么在:y=x-2*k1*X上,要么在:y=-x+2*k2*X上

通过分析:

①X=(x-y)/2k1;

②X=(x+y)/2k2;

③2k1=(x-y)/X;

④2k2=(x+y)/X;


很明显,其中(x+y)和(x-y)是固定不变的,那么我们想要X尽可能的小,那么显然需要2k1和2k2尽可能的大,然而需要2k1和2k2尽可能的大,我们又需要X尽可能的小,通过分析我们不难得出结论:X>=y,那么我们可以通过一个设定X=y,带入求得k1,以及k2我们还知道k1和k2是整数,那么对应我们向下取整的去求k1和k2

然后再带回①和②中秋两个X,取最小即为答案。


Ac代码:

#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>using namespace std;int main(){    double x,y;    while(~scanf("%lf%lf",&x,&y))    {        if(x<y)        {            printf("-1\n");        }        else if(x==y)        {            printf("%.9lf\n",x);        }        else        {            double k1=floor((x-y)/2/y);            double k2=floor((x+y)/2/y);            printf("%.9lf\n",min((x-y)/k1/2,(x+y)/k2/2));        }    }}





0 0