• 【26.09%】【codeforces 579C】A Problem about Polyline


    time limit per test1 second
    memory limit per test256 megabytes
    inputstandard input
    outputstandard 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 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.

    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.

    【题目链接】:http://codeforces.com/contest/579/problem/C

    【题解】

    先把两种类型的线段方程搞出来:
    /型的为y=x-2k*x0
    型的为y=-x+2k*x0
    先考虑/型
    移项一下
    x0 = (x-y)/(2*k);
    然后把(a,b)代入
    x0 = (a-b)/(2*k); ·····①
    然后再对k考虑
    k = (a-b)/(2*x0)
    因为x0为整个图像的最高的的y坐标;
    所以x0 >= b;
    则x0有最小值
    则k<=(a-b)/(2*b);
    再带回①式
    因为k有最大值;所以
    x0 >=(a-b)/(2*[(a-b)/(2*b)]);
    [x]表示不超过x的最大整数;
    对型的直线同理可以得到
    x0 >=(a+b)/(2*[(a+b)/(2*b)]);
    要注意(a+b)/(2*b)和(a-b)/(2*b)都要大于等于1才行;
    因为k就是原题中的n;而n显然应该要大于0;

    【完整代码】

    #include <bits/stdc++.h>
    #define LL long long
    
    using namespace std;
    
    LL a,b;
    
    int main()
    {
        cin >> a >> b;
        double ans;
        bool flag1 = true,flag2 = true;
        if (a>=b)
        {
            if (a==b)
                ans = b;
            else
            {
                int temp = (a-b)/(2.0*b);
                if (temp <1)
                    flag1 = false;
                ans =(a-b)/(2*temp*1.0);
            }
        }
        else
            flag1 = false;
        int temp = (a+b)/(2.0*b);
        if (temp < 1)
            flag2 = false;
        {
            double temp1 = (a+b)/(2*temp*1.0);
            if (!flag1)
                ans = temp1;
            else
                ans = min(ans,temp1);
        }
        if (flag1 || flag2)
            printf("%.12lf
    ",ans);
        else
            puts("-1");
        return 0;
    }
  • 相关阅读:
    debian8 vga 文本模式下出现闪屏
    Delphi中根据分类数据生成树形结构的最优方法
    SQL获取每月、每季度、每年的最后一天记录
    Delphi实现树型结构
    Delphi中initialization和finalization
    Delphi 连接 Paradox
    delphi2007单个文件(pas)的控件安装
    Delphi安装*.pas扩展名的控件
    数据库组件介绍(Delphi)
    Delphi控件开发浅入深出(三)
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632067.html
Copyright © 2020-2023  润新知