zoukankan      html  css  js  c++  java
  • hdu 2073 无限的路 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2073

         这是一道找规律的题目。给出两点((x1,y1)和(x2,y2)),假设以(0,0)这个起点开始画线。可以发现(0,1)->(1,0),(0,2)-> (2,0),...(0,n)-> (n,0)这些下降的线上才有多个分布的点,而这些点是有规律可循的,任意的点(x,y)的和等于它所处的线上的端点的x和y的和,而且越往线下画,它的x坐标在递增,y坐标在递减。而(1,0)->(0,2),(2,0)->(0,3)...(n,0)->(0,n+1)这些上升的线上是没有点的(除了端点)。        

         总的来说,算折线长度要分两种情况:1、给出的两点在同一条折线上(即x1+y1 = x2 + y2) 2、给出的两点不在同一条折线上(即x1+y1 != x2 + y2),此时需要分清究竟是哪一个点在前,哪一个点在后。 接下来就是判断经过多少条上升的线和多少条下降的线了,当然,这个判断对于两点不在同一条线上的情况才有的。当算到给出的点在线上时,就计算它跟端点之间的距离。其实我觉得代码有点重复,所以有点啰嗦。但是思路还是比较容易理解的。

     1 #include <iostream>
     2 #include <math.h>
     3 using namespace std;
     4 
     5 double distance (double x1, double y1, double x2, double y2)
     6 {
     7     return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
     8 }
     9 
    10 int main()
    11 {
    12     int cas, i, j, k, l;
    13     double x1, x2, y1, y2, sum;
    14     while (cin >> cas)
    15     {
    16         while (cas--)
    17         {
    18             cin >> x1 >> y1 >> x2 >> y2;
    19             sum = 0;
    20             if (x1 + y1 == x2 + y2)
    21                 printf("%.3lf\n", distance(x1, y1, x2, y2));    
    22             else if (x1 + y1 > x2 + y2)
    23             {
    24                 j = x2 + y2;  //分清哪个点在前(首点)
    25                 sum += distance(x2, y2, j, 0); //该点到它所在线的距离
    26                 l = x1 + y1;
    27                 for (k = j; k < l; k++)
    28                 {
    29                     sum += distance(k, 0, 0, k+1); //经过多少条上升的线并计算距离
    30                     if (k+1 < l)  
    31                         sum += distance(0, k+1, k+1, 0); //经过多少条下降的线并计算距离
    32 
    33                 }
    34                 sum += distance(x1, y1, 0, l); //末点到它所在线的距离
    35 
    36                 printf("%.3lf\n", sum);
    37             }
    38             else
    39             {
    40                 j = x1 + y1;
    41                 sum += distance(x1, y1, j, 0);
    42                 l = x2 + y2;
    43                 for (k = j; k < l; k++)
    44                 {
    45                     sum += distance(k, 0, 0, k+1);
    46                     if (k+1 < l)
    47                         sum += distance(0, k+1, k+1, 0);
    48                 }
    49                 sum += distance(x2, y2, 0, l);
    50                 printf("%.3lf\n", sum);
    51             }
    52         }
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    Mysql定时器定时删除表数据
    Mysql中文排序规则
    Swoole学习-Swoole入门指南
    Cygwin安装swoole及错误解决
    php://input ,$_POST, $_GET和$HTTP_RAW_POST_DATA
    tp5-微信消息接收和处理
    [软件工程] 千帆竞发图的制作
    [构建之法论坛] 助教之路
    VS社区版 使用 OpenCover 获取测试代码覆盖率
    支持多编程语言的自动测试系统
  • 原文地址:https://www.cnblogs.com/windysai/p/3050069.html
Copyright © 2011-2022 走看看