反思
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int main(){ int a,b,c1,c2; double ans,x,y; scanf("%d %d", &a, &b); if(a<b){ puts("-1"); } else if(a==b){ printf("%d\n", a); }else{ double x = a - b, y = a + b; int c1 = x/b/2, c2 = y/b/2; ans = min(x / c1 / 2, y / c2 / 2); printf("%.10lf\n", ans); } return 0; }
Description
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 value x such that it is true or determine that there is no such x.
Input
Only one line containing two positive integers a and b (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 exceed 10 - 9. If there is no such x then output - 1 as the answer.
Sample Input
Input
3 1
Output
1.000000000000
Input
1 3
Output
-1
Input
4 1
Output
1.250000000000
Hint
You can see following graphs for sample 1 and sample 3.
#include<iostream> #include<stdio.h> using namespace std; int main() { double x; double a,b; while(cin>>a>>b) { if(b>a) { x=-1; } else if(b==a) { x=a; } else { double r=(a+b)/2; double d=(a-b)/2; //cout<<r<<" "<<d<<endl; int rr=r/b,dd=d/b; while(r/rr<b) { rr--; } while(d/dd<b) { dd--; } //cout<<rr<<" "<<dd<<endl; if((double)r/rr>=(double)d/dd) { x=(double)d/dd; } else { x=(double)r/rr; } } printf("%.12f\n",x); } return 0; }