zoukankan      html  css  js  c++  java
  • C++ 城市路径

    #include<iostream>
    using namespace std;
    const int MAXN=100001;
    pair<int,int>coor[MAXN];
    int d(int a,int b)
    {
        return abs(coor[a].first-coor[b].first)+abs(coor[a].second-coor[b].second);
    }
    int main()
    {
        int n,;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>coor[i].first>>coor[i].second;
        }
        int sum=0;
        for(int i=2;i<=n;++i)
        {
            sum=sum+d(i,i-1);
        }
        int ans=sum;
        for(int j=2;j<n;++j)
        {
            ans=min(ans,sum-d(j,j-1)-d(j+1,j)+d(j-1,j+1));
        }
        cout<<ans;
       return 0;
    }

    代码先放上!

    试题描述:

    地图上有 n 个城市,一只奶牛要从 1 号城市开始依次经过这些城市,最终到达 n 号城市。但是这只奶牛觉得这样太无聊了,所以它决定跳过其中的一个城市(但是不能跳过 1 号和 n 号城市),使得它从1号城市开始,到达 n 号城市所经过的总距离最小。假设每一个城市 i 都有一个坐标(xi yi),从(x1y1)的城市 1 到(x2y2)的城市 2 之间的距离为|x1-x2|+|y1-y2|。

    输入:

    第1行1个正整数 n ,表示城市个数。
    接下来 n 行,每行 2 个数 xi 和 yi ,表示城市 i 的坐标。

    输出:

    一行一个数,使得它从1号城市开始,跳过某一个城市,到达 n 号城市所经过的最小总距离。

    输入实例:

    4
    0 0
    8 3
    11 -1
    10 0

    输出实例:
    14

    这是一道递推,对这是递推!!!

    那就让我们来推一下吧!
    先设f(i)为从城市1跳到城市i的距离和,设g(i)为从城市i跳到城市n的距离和,那么答案就可以写出来了! min(f(i-1)+g(i+1)+dis[i-1][i+1])
    其中dis[i-1][i+1]表示城市i-1到城市i+1的曼哈顿距离,f(i)和g(i)都可以用递推预处理求出:f(i)=f(i-1)+dis[i-1][i],g(i)=g(i+1)+dis[i][i+1];
    也可以设f(i)表示从城市1以此到城市n且跳过城市i的距离之和,sum表示从城市1以此跳到城市n的距离之和,则f(i)=min(sum-dis[i,i-1]-dis[i+1,i]+dis[i-1,i+1].
    科普一下 min 取的是最小值!
  • 相关阅读:
    Canvas文本绘制
    Canvas贝塞尔三级曲线
    Canvas贝塞尔二级曲线
    Canvas arcTo绘制圆弧
    mybatis springmvc调用oracle存储过程,返回记录集
    java调用oracle存储过程,返回结果集
    oracle存储过程返回结果集
    存储过程变量类型定义与表字段一致
    HTML5获取当前的经纬度坐标
    实现精灵沿着圆形轨迹运动
  • 原文地址:https://www.cnblogs.com/FXY-180/p/9370325.html
Copyright © 2011-2022 走看看