hdu1690Bus System--解题报告

题意:有一个公交系统的收费标准例如以下表:

然后问:给出 这些L1~4 & C1~4的值,然后 N个站。列出每一个站的X坐标。然后询问M次,问两个站台的最小花费

题解:那么这里非常明显是最短路问题。有一点的麻烦就在于建图,那么我们能够对于全部的点,用两个for循环。算出两两之间的距离。就能够得到花费是多少,同一时候建边。然后对于每次询问的点,我们就spfa一次就OK

<span style="font-size:14px;">#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <cstring>

using namespace std;

#define INF 0xffffffffffffff
#define MAX 105
#define LL __int64

int N,M;
LL L1,L2,L3,L4,C1,C2,C3,C4;
LL X[MAX];

struct Edge{
    int to,next;
    LL cost;
}edge[MAX*MAX];
int head[MAX],tol;

void add(int u,int v,LL cost)
{
    edge[tol].to = v;
    edge[tol].cost = cost;
    edge[tol].next = head[u];
    head[u] = tol++;
}

void del() //处理建边
{
    LL cost,dis;
    for(int i = 1; i <= N; i ++){
        for(int j = i+1; j <= N; j ++){
            if(X[i] > X[j]) dis = X[i]-X[j];
            else dis = X[j]-X[i];

            if(dis > L4) cost = INF;
            else if(dis > L3) cost = C4;
            else if(dis > L2) cost = C3;
            else if(dis > L1) cost = C2;
            else cost = C1;

            add(i,j,cost);
            add(j,i,cost);
        }
    }
}

LL dis[MAX];
bool flag[MAX];
LL spfa(int src,int D)
{
    for(int i = 1; i <= N; i ++) dis[i] = INF;
    memset(flag,false,sizeof(flag));
    dis[src] = 0;
    flag[src] = true;

    queue<int>q;
    q.push(src);

    while(!q.empty())
    {
        int u = q.front(); q.pop();
        flag[u] = false;
        for(int i = head[u]; i != -1; i = edge[i].next)
        {
            int v = edge[i].to; LL cost = edge[i].cost;
            if(cost + dis[u] < dis[v])
            {
                dis[v] = cost+dis[u];
                if(!flag[v])
                {
                    q.push(v);
                    flag[v] = true;
                }
            }
        }
    }
    return dis[D];
}

int main()
{
    int T;
    scanf("%d",&T);

    for(int cas = 1; cas <= T; cas ++)
    {
        scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d",&L1,&L2,&L3,&L4,&C1,&C2,&C3,&C4);
        scanf("%d%d",&N,&M);
        for(int i = 1; i <= N; i ++) scanf("%I64d",&X[i]);

        memset(head,-1,sizeof(head));
        tol = 0;

        del();

        printf("Case %d:\n",cas);
        int a,b;
        LL ans = 0;
        for(int i = 0; i < M; i ++)
        {
            scanf("%d%d",&a,&b);
            ans = spfa(a,b);
            if(ans >= INF)
               printf("Station %d and station %d are not attainable.\n",a,b);
            else
               printf("The minimum cost between station %d and station %d is %I64d.\n",a,b,ans);
        }
    }

    return 0;
}</span>

那么这里的话,还要注意的是 由于坐标值比較大,我们用 64位来保存

时间: 2025-01-07 06:00:36

hdu1690Bus System--解题报告的相关文章

解题报告——-2018级2016第二学期第三周作业

解题报告——2018级2016第二学期第三周作业 A:[NOIP2002P]过河卒 题目: 描述 如图,A 点有一个过河卒,需要走到目标 B   点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例 如上图 C  点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C).卒不能通过对方马的控制点. 棋盘用坐标表示,A 点(0,0).B 点(n,m)(n,m 为不超过 20  的整数,并由键盘输入)

Hdu 4386 Play the Dice 解题报告

hdu 4586---Play the dice 解题思路:概率 题目描述:一个骰子有n面,每面朝上的概率相同,并且每一面上面都有一个数字,其中有m面是彩色的,代表掷到彩色面的时还可以继续掷下去,问最终掷得的数字的期望是多少? 解题方法: 方法一:只考虑单独掷每一次的情况,可以发现,每次掷到的期望是和先前无关的,假设a=sum/n(每掷一次的期望都是a),比如:掷第一次的时候期望是a,掷第二次的时候期望便是(m/n)*a,因为有(m/n)的概率能够掷第二次..依次可以继续下去,等比求和即可. u

leetCode解题报告5道题(六)

题目一: Longest Substring Without Repeating Characters Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the

解题报告——2018级2016第二学期第五周作业排座椅

解题报告--2018级2016第二学期第五周作业 F:排座椅 描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来 之后,只有有限的D对同学上课时会交头接耳.同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设 置了K条横向的通道,L条纵向的通道.于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅

poj分类解题报告索引

图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Journey poj1724 - ROADS(邻接表+DFS) BFS poj3278 - Catch That Cow(空间BFS) poj2251 - Dungeon Master(空间BFS) poj3414 - Pots poj1915 - Knight Moves poj3126 - Prim

LeetCode: Permutations 解题报告

Permutations Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1]. SOLUTION 1: 经典的递归回溯题目,一次ACCEPT. 请也参考上一个题目LeetCode: Combination

LeetCode解题报告:Reorder List

Reorder List Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do this in-place without altering the nodes' values. For example,Given {1,2,3,4}, reorder it to {1,4,2,3}. 思路: 1.利用快慢两个指针将链表一分为二: 2.针对第二个子链表求倒序

[LeetCode]LRU Cache, 解题报告

题目 Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set. get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.

[LeetCode]Candy, 解题报告

前言 回学校写论文差不多快二周的时间了,总结一句话,在学校真舒服.花了7天时间搞定了毕业论文初稿(之所以这么快肯定跟我这三年的工作量相关了),不过今天导师批复第二章还是需要修改.此外,最近迷上打羽毛球,确实很爽,运动量仅此于篮球,可以场地有限,哎,且打且珍惜吧. 题目 There are N children standing in a line. Each child is assigned a rating value. You are giving candies to these chi

解题报告 之 ZOJ3861 Valid Pattern Lock

解题报告 之 ZOJ3861 Valid Pattern Lock Description Pattern lock security is generally used in Android handsets instead of a password. The pattern lock can be set by joining points on a 3 × 3 matrix in a chosen order. The points of the matrix are registere