CF 578A A Problem about Polyline
2015-09-17 09:56
302 查看
题意:
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.
思路:先大概确定范围,再二分。
代码:
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.
思路:先大概确定范围,再二分。
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<queue> #include<algorithm> #include<cmath> #include<map> using namespace std; #define INF 0x7fffffff int main(){ int a,b,x,y; double ans = INF; while(scanf("%d%d",&x,&y) == 2){ if(y > x){ printf("-1\n"); continue; } else if(y == 0){ printf("0.000000000001\n"); continue; } b = x+y; int k = 1; int t ; ans = INF ; for(; ;){ t = k; k *= 2; if(b*1.0/k >= y) ans = ans < b*1.0/k ? ans : b*1.0/k ; else break; } while(t<k){ int mid = (t+k)/2; if(mid%2 == 1) break; if(b*1.0/mid >= y) t = mid ; else k = mid ; } if(t == 1) t = 2; if(k == 1) k = 2; double s1 = b*1.0/k; double s2 = b*1.0/t; if(s1 >= y && s2 >= y) ans = s1 > s2 ? s2 : s1 ; else if(s1 >= y) ans = s1; else ans = s2; b = y -x ; if(b<0) b = -b; if(b == 0){ printf("%.12lf\n",(double)y); continue; } k = 1; for(; ;){ t = k; k *= 2; if(b*1.0/k >= y) ans = ans < b*1.0/k ? ans : b*1.0/k ; else break; } while(t<k){ int mid = (t+k)/2; if(mid%2 == 1) break; if(b*1.0/mid >= y) t = mid ; else k = mid ; } if(t == 1) t = 2; if(k == 1) k = 2; s1 = b*1.0/k; s2 = b*1.0/t; if(s1 >= y && s2 >= y){ double temp = s1 > s2 ? s2 : s1 ; ans = temp; } else if(s1 >= y) ans = ans > s1 ? s1 : ans; else if(s2 >= y) ans = ans > s2 ? s2 : ans; printf("%.12lf\n",ans); } return 0; }
相关文章推荐
- 摘要JSR168 PORLET标准手册汉化整理
- win8本地连接无法禁用
- Struts 2 – Development mode example
- 成本中心领用接口
- 第十章 基本数据结构
- 传智播客助力一带一路IT人才培养
- sqlserver text/ntext 字段读取
- Android 开发之 ---- 底层驱动开发(一)
- CXF-Spring发布 Cannot create a secure XMLInputFactory
- C语言算法小练习-4
- 设置网页图标、任务栏图标
- Android 实现沉浸式状态栏
- OSI各层数据名称
- PropertiesLoaderUtils.loadAllProperties()
- 用foreach遍历改变二维数组中的值
- ubuntu编译ffmpeg并且demo测试
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] C A Weakness and Poorness (三分)
- Aspose Word模板使用总结
- 基于CSS实现的4级下拉菜单效果代码