题意: 一条过点(0, 0) – (x, x) – (2x, 0) – (3x, x) – (4x, 0) – ... - (2kx, 0) – (2kx + x, x) – ....的折线,再给出点(a,b),问经过点(a,b)的折线中,x最小是多少?如果没有折线经过(a, b)则输出-1。答案精确到小数点后9位。
思路:‘/’ 方程式:y=x-2*k*x0 '\'方程式:y=x+x*k*x0 分析可知由于0<x0<=b 所以把x0=b 带入方程得到k,又因为k为整数,将向下k取整后带回原方程就解出x0,ans=两个方程式最小的x0;
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <string.h>
#include <map>
#include <set>
#include <stdlib.h>
using namespace std;
#define maxn 100005
#define inff 0x3FFFFFFF
double Min(double x,double y)
{
return x<y?x:y;
}
int main()
{
double a,b;
double aab,asb,k1,k2;
while(cin>>a>>b)
{
aab=a+b;
asb=a-b;
if(asb==0)
{
printf("%.12lf\n",b);continue;
}
if(asb<0)
{
printf("-1\n");
continue;
}
k1=floor(aab/2.0/b);//floor函数向下取整,返回类型为double
k2=floor(asb/2.0/b);
printf("%.12lf\n",Min(aab/2.0/k1,asb/2.0/k2));
}
return 0;
}