题目链接 codeforces 578 A
题意:
给出一条折线,线上的点分别为 (0, 0) – (x, x) – (2x, 0) – (3x, x) – (4x, 0) – ... - (2kx, 0) – (2kx + x, x) – ....,输入x, y,问这个点在这条折线上时,X 最小可以是多少
题解
由此可以直接看出,当 x < y 时,不可能出现在折线上,输出-1
当x == y 时,X不可能再低,所以X就是 y 值
当x > y 时,由点坐标可以看出,点一定分布在斜率为 1 或斜率为 -1 的直线上,分析直线方程
y1 = x1 - 2*k1*X (直线不是固定的,所以k是整数倍,k的范围[0,1,2....],X的范围[y, .... x]);
y2 = -x1 + 2*k2*X (直线不是固定的,所以k是整数倍,k的范围[0,1,2....],X的范围[y, .... x]);
由方程看出2kX 是常量,所以当k取最大值时,X此时最小, X最小值可以取 y X>=y
k1 = (y1-x1) / 2 / X k2 = (y2-x2) / 2 / X X 取 y
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int x, y;
cin >> x >> y;
if(x < y){
cout << "-1" << endl;
}
else if(x == y){
cout << y << endl;
}
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));
}
return 0;
}