zoukankan      html  css  js  c++  java
  • Codeforces I. Barcelonian Distance(暴力)

    题目描述:

    In this problem we consider a very simplified model of Barcelona city.

    Barcelona can be represented as a plane with streets of kind x=cx=c and y=cy=c for every integer cc (that is, the rectangular grid). However, there is a detail which makes Barcelona different from Manhattan. There is an avenue called Avinguda Diagonal which can be represented as a the set of points (x,y)(x,y) for which ax+by+c=0ax+by+c=0.

    One can walk along streets, including the avenue. You are given two integer points AAand BB somewhere in Barcelona. Find the minimal possible distance one needs to travel to get to BB from AA.

    Input

    The first line contains three integers aa, bb and cc (−109≤a,b,c≤109−109≤a,b,c≤109, at least one of aa and bb is not zero) representing the Diagonal Avenue.

    The next line contains four integers x1x1, y1y1, x2x2 and y2y2 (−109≤x1,y1,x2,y2≤109−109≤x1,y1,x2,y2≤109) denoting the points A=(x1,y1)A=(x1,y1) and B=(x2,y2)B=(x2,y2).

    Output

    Find the minimum possible travel distance between AA and BB. Your answer is considered correct if its absolute or relative error does not exceed 10−610−6.

    Formally, let your answer be aa, and the jury's answer be bb. Your answer is accepted if and only if |a−b|max(1,|b|)≤10−6|a−b|max(1,|b|)≤10−6.

    Examples

    Input

        1 1 -3
        0 3 3 0

    Output

    4.2426406871

    Input

        3 1 -9
        0 3 3 -1

    Output

    6.1622776602

    思路:

    刚开始,凭感觉做的是通过画图,像是从A点出发直着向上/向下到达直线,从A点出发直着向右/向左到达直线,与从B出发直着向上/向下到达直线,从B出发直着向右/向左到达直线,共四种组合的距离,加上曼哈顿距离,求最小距离

    然后,想的是从A点开始,到与直线相交,的每一种情况下,B也同样处理得到距离的最小值,说的不太清楚,如图

    对每个A来说,算出每个B路径下的总的距离,取最小。

    这里面有几个路径在程序中没包括,就是上图的紫色和黄色,组合在一起的情况,不过这样算会最终超时

    小心的是数据用long long,不然计算中会溢出,还有输出格式的设置,想要设置成浮点数(不用科学计数法),设置精度等等

    知识点:暴力

    代码:

    (忽略dd函数,那是会查实的,程序实际调用的是dd1函数)

      1 #include <iostream>
      2 #include <cmath>
      3 #include <iomanip>
      4 #include <climits>
      5 using namespace std;
      6 long long a,b,c;
      7 long long x1,y1;
      8 long long x2,y2;
      9 double dd1(long long x1,long long y1,long long x2,long long y2)
     10 {
     11     double dist1 = 0;
     12     double yy1 = (-a*x1-c)/(double)b;
     13     dist1 += abs(y1-yy1);
     14     double yy2 = (-a*x2-c)/(double)b;
     15     dist1 += abs(y2-yy2);
     16     dist1 += sqrt((x1-x2)*(x1-x2)+(yy1-yy2)*(yy1-yy2));
     17     double dist2 = 0;
     18     double xx2 = (-b*y2-c)/(double)a;
     19     dist2 += abs(x2-xx2);
     20     dist2 += abs(y1-yy1);
     21     dist2 += sqrt((x1-xx2)*(x1-xx2)+(yy1-y2)*(yy1-y2));
     22     double dist3 = 0;
     23     double xx1 = (-b*y1-c)/(double)a;
     24     dist3 += abs(xx1-x1);
     25     dist3 += abs(x2-xx2);
     26     dist3 += sqrt((xx1-xx2)*(xx1-xx2)+(y1-y2)*(y1-y2));
     27     double dist4 = 0;
     28     dist4 += abs(xx1-x1);
     29     dist4 += abs(y2-yy2);
     30     dist4 += sqrt((xx1-x2)*(xx1-x2)+(y1-yy2)*(y1-yy2));
     31     double dist = dist1;
     32     dist = min(dist,dist2);
     33     dist = min(dist,dist3);
     34     dist = min(dist,dist4);
     35     return dist;
     36 }
     37 double dd(int x1,int x2,int x3,int x4)
     38 {
     39     double mdist = INT_MAX;
     40     double xx1 = (-b*y1-c)/(double)a;
     41     double xx2 = (-b*y2-c)/(double)a;
     42     int length = abs(x1-(int)xx1);
     43     for(int i = 0;i<=length;i++)
     44     {
     45         double dist = 0;
     46         int x;
     47         if(a*x1+b*x2+c<0)
     48         {
     49             x = x1+i;
     50         }
     51         else
     52         {
     53             x = x1-i;
     54         }
     55         dist += i;
     56         double yy1 = (-a*x-c)/(double)b;
     57         dist += abs(y1-yy1);
     58         int length2 = abs(x2-(int)xx2);
     59         for(int j = 0;j<=length2;j++)
     60         {
     61             if(a*x2+b*x2+c<0)
     62             {
     63                 x = x2+j;
     64             }
     65             else
     66             {
     67                 x = x2-j;
     68             }
     69             dist += j;
     70             double yy2 = (-a*x-c)/(double)b;
     71             dist += abs(y2-yy2);
     72             dist += sqrt((x2-x1)*(x2-x1)+(yy1-yy2)*(yy1-yy2));
     73             if(dist<mdist)
     74             {
     75                 mdist = dist;
     76             }
     77         }
     78 
     79     }
     80     double dist = dd1(x1,x2,y1,y2);
     81     if(dist<mdist)
     82     {
     83         mdist = dist;
     84     }
     85     return mdist;
     86 }
     87 int main()
     88 {
     89     cin >> a >> b >> c;
     90     cin >> x1 >> y1 >> x2 >> y2;
     91     double dist = abs(x1-x2)+abs(y1-y2);
     92     if(a!=0&&b!=0)
     93     {
     94         double ans = dd1(x1,y1,x2,y2);
     95         cout.setf(ios_base::fixed,ios_base::floatfield);
     96         cout << setprecision(11) << min(dist,ans) << endl;
     97     }
     98     else
     99     {
    100         cout.setf(ios_base::fixed,ios_base::floatfield);
    101         cout << dist << endl;
    102     }
    103     return 0;
    104 }
  • 相关阅读:
    最新Navicat Premium12 破解方法,亲测可用
    (转)Navicat_12安装与破解激活,注册机亲测可用
    使用ApiPost模拟发送get、post、delete、put等http请求
    模拟POST、Get 请求的工具----APIpost(中文版POSTMAN)
    推荐一款接口文档生成工具,apipost,好用
    作为后端开发者,如何更优雅、便捷的生成接口文档?
    使用apipost调试api接口并快速生成接口文档的一些小技巧,比postman更好用
    中文版postman——apipost,不试一下,你就不知道它有多香
    ApiPost如何在预执行脚本里添加请求参数?
    ApiPost的预执行脚本和后执行脚本
  • 原文地址:https://www.cnblogs.com/zhanhonhao/p/11219835.html
Copyright © 2011-2022 走看看