zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    Windows系统下八大具有高逼格的DOS命令之一【ping】
    NOIP初赛 之 逻辑运算
    动态规划 —— 背包问题一 专项研究学习
    使用前端原生 js,贪吃蛇小游戏
    纯html+css制作3D立方体和动画效果
    css3实现3D动画轮播图
    原生js的弹力小球
    小球的问题
    早期练手:功能相对比较完善的 js 计算器
    自动布局简介
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632067.html
Copyright © 2011-2022 走看看