• Codeforces Round #182 (Div. 1) B. Yaroslav and Time 最短路


    题目链接:

    http://codeforces.com/problemset/problem/301/B

    B. Yaroslav and Time

    time limit per test2 seconds
    memory limit per test256 megabytes
    #### 问题描述 > Yaroslav is playing a game called "Time". The game has a timer showing the lifespan he's got left. As soon as the timer shows 0, Yaroslav's character dies and the game ends. Also, the game has n clock stations, station number i is at point (xi, yi) of the plane. As the player visits station number i, he increases the current time on his timer by ai. The stations are for one-time use only, so if the player visits some station another time, the time on his timer won't grow. > > A player spends d·dist time units to move between stations, where dist is the distance the player has covered and d is some constant. The distance between stations i and j is determined as |xi - xj| + |yi - yj|. > > Initially, the player is at station number 1, and the player has strictly more than zero and strictly less than one units of time. At station number 1 one unit of money can increase the time on the timer by one time unit (you can buy only integer number of time units). > > Now Yaroslav is wondering, how much money he needs to get to station n. Help Yaroslav. Consider the time to buy and to increase the timer value negligibly small. #### 输入 > The first line contains integers n and d (3 ≤ n ≤ 100, 103 ≤ d ≤ 105) — the number of stations and the constant from the statement. > > The second line contains n - 2 integers: a2, a3, ..., an - 1 (1 ≤ ai ≤ 103). The next n lines contain the coordinates of the stations. The i-th of them contains two integers xi, yi (-100 ≤ xi, yi ≤ 100). > > It is guaranteed that no two stations are located at the same point. #### 输出 > In a single line print an integer — the answer to the problem. ####样例输入 > 3 1000 > 1000 > 0 0 > 0 1 > 0 3

    样例输出

    2000

    题意

    给你二维上的n个点,两个点的时间消耗为哈密顿距离*d,且到第i个点能补充a[i]的时间,问你在起始点需要买多少的时间才能保证你能够到终点。

    题解

    对于每条边(u,v),边权定为d*(u到v的哈密顿距离)-a[v],然后由点n到点1跑spfa最短路,这里注意:由于题目给的d和a的范围,导致都是正权图。

    代码

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<ctime>
    #include<vector>
    #include<cstdio>
    #include<string>
    #include<bitset>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<functional>
    using namespace std;
    #define X first
    #define Y second
    #define mkp make_pair
    #define lson (o<<1)
    #define rson ((o<<1)|1)
    #define mid (l+(r-l)/2)
    #define sz() size()
    #define pb(v) push_back(v)
    #define all(o) (o).begin(),(o).end()
    #define clr(a,v) memset(a,v,sizeof(a))
    #define bug(a) cout<<#a<<" = "<<a<<endl
    #define rep(i,a,b) for(int i=a;i<(b);i++)
    #define scf scanf
    #define prf printf
    
    typedef __int64 LL;
    typedef vector<int> VI;
    typedef pair<int,int> PII;
    typedef vector<pair<int,int> > VPII;
    
    const int INF=0x3f3f3f3f;
    const LL INFL=0x3f3f3f3f3f3f3f3fLL;
    const double eps=1e-8;
    const double PI = acos(-1.0);
    
    //start----------------------------------------------------------------------
    
    const int maxn=111;
    
    struct Edge {
        int u,v,d;
        Edge(int u,int v,int d):u(u),v(v),d(d) {}
    };
    
    int n,D;
    int arr[maxn];
    int mat[maxn][maxn];
    PII pt[maxn];
    
    int dis(int i,int j) {
        return abs(pt[i].X-pt[j].X)+abs(pt[i].Y-pt[j].Y);
    }
    
    
    bool inq[maxn];
    LL d[maxn];
    LL spfa(int s) {
        queue<int> Q;
        clr(inq,0);
        for(int i=1; i<=n; i++) d[i]=INFL;
        d[s]=0,inq[s]=true,Q.push(s);
        while(!Q.empty()) {
            int u=Q.front();
            Q.pop();
            inq[u]=false;
            for(int v=1;v<=n;v++){
                if(v==u) continue;
                if(d[v]>d[u]+mat[u][v]){
                    d[v]=d[u]+mat[u][v];
                    if(!inq[v]){
                        Q.push(v); inq[v]=1;
                    }
                }
            }
        }
        return d[1];
    }
    
    int main() {
        scf("%d%d",&n,&D);
        arr[1]=arr[n]=0;
        for(int i=2; i<n;i++) scf("%d",&arr[i]);
    
        for(int i=1; i<=n; i++) {
            scf("%d%d",&pt[i].X,&pt[i].Y);
        }
    
        for(int i=1; i<=n; i++) {
            for(int j=1; j<=n; j++) {
                if(i==j) mat[i][j]=0;
                else mat[i][j]=dis(i,j)*D-arr[j];
            }
        }
    
        LL ans=spfa(n);
    
        prf("%I64d
    ",ans);
    
        return 0;
    }
    
    //end-----------------------------------------------------------------------
  • 相关阅读:
    python之read()方法
    python之高阶函数
    python之lambda表达式的应用
    DevExpress.XtraGrid.view.gridview 说明文
    C# SQL时间格式
    GridControl自动定位至符合条件的行
    用sql命令修改数据表
    用C#编程从数据库中读取图片数据导进Excel文件的方法(如何从数据库中读取保存的文件,直接打开,中间不保存到本地)
    DevExpress中GridControl的属性设置及动态绑定数据和全选取消全选
    C# 导出数据到Excel模板中
  • 原文地址:https://www.cnblogs.com/fenice/p/5897448.html
Copyright © 2020-2023  润新知