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 }
  • 相关阅读:
    初识python: random 模块
    初识python: 模块定义及调用
    JSON的stringify和parse方法
    微信小程序:日期组件picker的使用
    微信小程序:给data中对象中的属性设置值与给data中的属性或对象或数组设置值的区别
    微信小程序:点击预览大图功能
    微信小程序:解决小程序中有些格式如webpiPhone手机暂不支持的问题
    微信小程序:优化页面要渲染的属性
    微信小程序:标签字符串直接变成标签来显示要通过富文本技术
    微信小程序:添加全局的正在加载中图标效果
  • 原文地址:https://www.cnblogs.com/zhanhonhao/p/11219835.html
Copyright © 2011-2022 走看看