zoukankan      html  css  js  c++  java
  • UVA 10841 Lift Hopping in the Real World(dijkstra)

    题意:电梯调度的加强版,有N个电梯,每个电梯只能到规定的楼层停,从A电梯到B电梯时需要花5秒时间,并且还需要等待B电梯停到这层花费的时间(按最糟糕的情况处理)

     分析:因为最优策略是每个电梯最多搭乘一次,若搭乘多次则花费的时间会更多..所以不用考虑每个电梯搭乘后的状态..

           松弛时一定是一个电梯到另一个电梯,因为在同一个电梯无法松弛!

    // File Name: 10841.cpp
    // Author: Zlbing
    // Created Time: 2013/5/19 12:58:02
    
    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<cstdlib>
    #include<cstdio>
    #include<set>
    #include<map>
    #include<vector>
    #include<cstring>
    #include<stack>
    #include<cmath>
    #include<queue>
    using namespace std;
    #define CL(x,v); memset(x,v,sizeof(x));
    #define INF 0x3f3f3f3f
    #define LL long long
    #define REP(i,r,n) for(int i=r;i<=n;i++)
    #define RREP(i,n,r) for(int i=n;i>=r;i--)
    const int MAXN=150;
    
    int n,k;
    int T[MAXN];
    int G[MAXN][MAXN];
    int f[MAXN];
    int maxn[MAXN];
    int minn[MAXN];
    struct node{
        int u,cost;
        bool operator <(const node& rhs)const{
            return cost>rhs.cost;
        }
    };
    int vis[MAXN];
    int d[MAXN];
    int dij()
    {
        CL(vis,0);
        CL(d,-1);
        priority_queue<node> Q;
        Q.push((node){0,0});
        node t,tt;
        while(!Q.empty())
        {
            t=Q.top();
            Q.pop();
            if(t.u==k)return t.cost;
            int u=t.u;
            int cost=t.cost;
            if(vis[u])continue;
            vis[u]=1;
            for(int i=0;i<n;i++)
                if(G[i][u]){
                    int a=T[i]*(maxn[i]-u);
                    int b=T[i]*(u-minn[i]);
                    int tmp=max(a,b);
                    for(int j=0;j<105;j++)
                    {
                        if(u==j)continue;
                        if(G[i][j])
                        {
                            if(u==0)
                            {
                                tt.u=j;
                                tt.cost=tmp+cost+abs(j-u)*T[i];
                                Q.push(tt);
                                //printf("i=%d %d->%d cost=%d\n",i,u,tt.u,tt.cost);
                            }
                            else{
                                tt.u=j;
                                tt.cost=tmp+cost+abs(j-u)*T[i]+5;
                                Q.push(tt);
                                //printf("i=%d %d->%d cost=%d\n",i,u,tt.u,tt.cost);
                            }
                        }
                    }
                }
        }
        return -1;
    }
    int main()
    {
        while(~scanf("%d%d",&n,&k))
        {
            REP(i,0,n-1)
            {
                scanf("%d",&T[i]);
            }
            CL(G,0);
            CL(f,0);
            char ch[MAXN*10];
            CL(minn,-1);
            CL(maxn,-1);
            REP(i,0,n-1)
            {
                int a=0;
                do{
                    scanf("%d",&a);
                    G[i][a]=1;
                    if(maxn[i]==-1)
                        maxn[i]=a;
                    else maxn[i]=max(maxn[i],a);
                    if(minn[i]==-1)
                        minn[i]=a;
                    else minn[i]=min(minn[i],a);
                }while(getchar()!='\n');
            }
            int ans=dij();
            if(ans==-1)
                printf("IMPOSSIBLE\n");
            else printf("%d\n",ans);
        }
        return 0;
    }
  • 相关阅读:
    实验 MPLS LDP配置
    IEEP-OSPF域内路由故障-现象与排障思路
    IEEP部署企业级网络工程-OSPF邻居关系故障排除
    IEEP部署企业级网络工程-网络故障-环路故障
    IEEP-网络实施-项目交付流程
    Python正则表达式
    如何解决TortoiseSVN不显示状态小图标问题
    如何在win下一键升级 python 所有包
    vmware workstation 与 device/credential guard 不兼容
    windows系统中在jupyter安装虚拟环境内核
  • 原文地址:https://www.cnblogs.com/arbitrary/p/3087496.html
Copyright © 2011-2022 走看看