zoukankan      html  css  js  c++  java
  • 搜狗2019秋招的一道算法题:龟兔赛跑

    时间限制:3秒

    空间限制:92160K

    定义如下图所示的比赛地图:
     
    S表示比赛起点,E表示比赛终点。实线表示陆路,虚线表示水路。兔子只能走陆路,乌龟既可以走陆路也可以走水路。每条路径的长度在图中给出。假定兔子和乌龟足够聪明,问谁先到达终点。

    输入描述:
    第1行输入v1,v2。v1是兔子的速度,v2是乌龟的速度(水路、陆路速度相同)。第2行输入n,m,点的编号是1~n,然后是m行,其中1是起点,n是终点(路径本身不限定方向)。下面m行4个数 a, b, d, c,表示a和b之间有一条边,且其长度为d,类型是c(0表示陆路,1表示水路)。最后一行是end,表示输入结束。输入保证1和n之间至少有一条路径联通。(1<n<=10000, 0<m<=1000000)。

    输出描述:
    输出-1,0,1中的一个数。-1表示乌龟获胜,1表示兔子获胜,0表示同时到达终点。

    输入例子1:
    10 5
    3 3 
    1 2 30 0
    2 3 20 0
    1 3 20 1
    end

    输出例子1:
    -1

    声明:这道题在牛客提交只过了90%的数据,拿到了45分,最后一个样例没过,思考了很久,认为都考虑到了,又看了下分数排名,我认为他们的最后一个比较大的case数据有问题。如果有人都过了case
    也可以留下评论,我哪里写错了。
    代码如下:
    #include <stdio.h>
    #include <string.h>
    #include <stdio.h>
    #include <algorithm>
    #include <math.h>
    #include <vector>
    #define INF 2100000000
    
    using namespace std;
    
    int n, m;
    struct node
    {
        int point; //端点
        int weight; //路径长度
        bool worl; //是否水路
    };
    vector<node>amap[10010];
    unsigned int dis[10010];
    bool vis[10010];
    
    int Dijkstra(bool torr)
    {
        memset(vis, false, sizeof(vis));
        for(int i=1; i<=n; i++) {
            dis[i] = INF; //代表不可达
        }
        int len = amap[1].size();
    
        if(torr) {
            for(int i=0; i<len; i++) {
                if( amap[1][i].weight < dis[amap[1][i].point] )
                    dis[amap[1][i].point] = amap[1][i].weight;
            }
        } else {
            for(int i=0; i<len; i++) {
                if( !amap[1][i].worl && amap[1][i].weight < dis[amap[1][i].point] )
                    dis[amap[1][i].point] = amap[1][i].weight;
            }
        }
    
        vis[1] = true;
    
        for(int k=0; k<n-1; k++) {
            int pos, mdis = INF;
    
            for(int i=1; i<=n; i++) {
                if(!vis[i] && dis[i] < mdis) {
                    mdis = dis[i]; pos = i;
                }
            }
            vis[pos] = true;
            len = amap[pos].size();
    
            if(torr == true) { // 乌龟的话,所有的dis都可以拿来更新
                for(int j=0; j<len; j++) {
                    if( !vis[amap[pos][j].point] && dis[amap[pos][j].point] > (amap[pos][j].weight+dis[pos]) ) {
                        dis[ amap[pos][j].point ] = amap[pos][j].weight + dis[pos];
                    }
                }
            } else { // 兔子的话,更新的可选路径必须是陆路
                for(int j=0; j<len ; j++) {
                    if( !vis[amap[pos][j].point] && !amap[pos][j].worl && dis[amap[pos][j].point] > (amap[pos][j].weight+dis[pos]) )
                        dis[ amap[pos][j].point ] = amap[pos][j].weight + dis[pos];
                }
            }
        }
        return dis[n];
    }
    
    int main()
    {
        double vt, vg;
        scanf("%lf %lf", &vt, &vg);
        scanf("%d %d", &n, &m);
    
        int a, b, c, d;
        node cur;
        for(int i=0; i<m; i++) {
            scanf("%d %d %d %d", &a, &b, &c, &d);
            cur.point = b;
            cur.weight = c;
            cur.worl = (d==1?true:false);
            amap[a].push_back(cur);
        }
        char str[100];
        scanf("%s", str);
    
        double tt = (double)Dijkstra(false) / vt; // tu zi
        double tg = (double)Dijkstra(true) / vg; // gui
    
        double eps = 1e-8;
        if(fabs(tt - tg) < eps) {
            printf("0
    ");
        } else if(tt - tg > eps) {
            printf("-1
    ");
        } else {
            printf("1
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    sql 事务
    GridView数据导入Excel
    图片对比度亮度调节函数
    在.NET(C#)中获取电脑名IP地址及当前用户名
    一个简单的存储过程
    通用海量数据库翻页
    Graphics
    sql 触发器
    DataTable中的数据导出Excel文件
    窗口渐变
  • 原文地址:https://www.cnblogs.com/yspworld/p/10527435.html
Copyright © 2011-2022 走看看