zoukankan      html  css  js  c++  java
  • 繁繁的游戏

    题目描述

    					繁繁想和小伙伴们打游戏,游戏在一个山庄进行,这个山庄有N座山,编号为1到N,为了方便大家在不同的山之间移动,繁繁建了一些桥,由于技术的原因,桥连接的两座山的高度差不能超过d,现在已知这些桥,求这个山庄最高的山和最低的山差距最大是多少?数据保证所有山之间都是联通的。						
    

    输入

    					第一个一个数T,表示测试数据数量(T<=5,2<=N<=50,0<=d<=1000) 
    

    每组数据第一行两个数N和d
    接下来一个N行N列的矩阵,第i行j列为Y表示i和j之间建了一座桥,否则表示没有建保证第i行j列和第j行i列值相同,并且第i行第i列值为N

    输出

    					T行,每行一个答案,若最大值可能为正无穷,输出-1						
    

    样例输入

    3 
    3 10 
    NYN 
    YNY 
    NYN 
    2 1 
    NN 
    NN 
    6 1000 
    NNYNNN 
    NNYNNN 
    YYNYNN 
    NNYNYY 
    NNNYNN 
    NNNYNN
    

    样例输出

    20 
    -1 
    3000
    

    提示

    第一个样例,1和2之间不能超过d,2和3之间不能超过d,那么最大就是1和2差恰好为d,2和3差恰好为d
    

    对于20%的数据,T<=3,N<=40
    对于50%的数据,T<=3
    对于100%的数据,T<=5,2<=N<=50,0<=d<=1000

    代码

    //#pragma GCC optimize(3)
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<climits>
    #include<queue>
    #include<set>
    #define max(x,y) ((x)>(y)?(x):(y))
    #define min(x,y) ((x)<(y)?(x):(y))
    #define swap(x,y) (x^=y,y^=x,x^=y)
    typedef long long ll;
    using namespace std;
    template<typename T>inline void read(T &x)
    {
        x=0;
        T f=1;
        char c=getchar();
        for(; c<'0'||c>'9'; c=getchar()) if(c=='-') f=-1;
        for(; c>='0'&&c<='9'; c=getchar()) x=(x<<1)+(x<<3)+(c&15);
    }
    template<typename T>inline void print(T x)
    {
        if(x<0) putchar('-'),x*=-1;
        if(x>=10) print(x/10);
        putchar(x%10+'0');
    }
    const int N=55;
    const int INF=0x3f3f3f3f;
    int num[N][N];
    int n,d;
    int main()
    {
        int t;
        read(t);
        char ch;
        while(t--)
        {
            memset(num,0x3f,sizeof(num));
            read(n);
            read(d);
            for(int i=1; i<=n; i++)
                for(int j=1; j<=n; j++)
                {
                    cin>>ch;
                    if(ch=='Y')
                        num[i][j]=num[j][i]=1;
                }
            for(int k=1; k<=n; k++)
                for(int i=1; i<=n; i++)
                    for(int j=1; j<=n; j++)
                    {
                        num[i][j]=min(num[i][j],num[i][k]+num[k][j]);
                    }
            int ans=0;
            for(int i=1; i<=n; i++)
                for(int j=i+1; j<=n; j++)
                    ans=max(ans,num[i][j]);
            if(ans==INF)
                cout<<-1<<endl;
            else
            {
                print(ans*d);
                puts("");
            }
        }
        return 0;
    }
    
    

    思路

    所以最短路的最大值。

    PS

    最短路是基于dp思想的,注意模板,以下这种dp不可取。

    贴一个错误的代码

    //#pragma GCC optimize(3)
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<climits>
    #include<queue>
    #include<set>
    #define max(x,y) ((x)>(y)?(x):(y))
    #define min(x,y) ((x)<(y)?(x):(y))
    #define swap(x,y) (x^=y,y^=x,x^=y)
    typedef long long ll;
    using namespace std;
    template<typename T>inline void read(T &x)
    {
        x=0;
        T f=1;
        char c=getchar();
        for(; c<'0'||c>'9'; c=getchar()) if(c=='-') f=-1;
        for(; c>='0'&&c<='9'; c=getchar()) x=(x<<1)+(x<<3)+(c&15);
    }
    template<typename T>inline void print(T x)
    {
        if(x<0) putchar('-'),x*=-1;
        if(x>=10) print(x/10);
        putchar(x%10+'0');
    }
    const int N=55;
    int num[N][N];
    int n,d;
    ll dp[N];
    int main()
    {
        int t;
        read(t);
        while(t--){
        memset(dp,0,sizeof(dp));
        memset(num,0,sizeof(num));
        char ch;
        read(n);
        read(d);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
        {
            cin>>ch;
            if(ch=='Y')
            {
                num[i][j]=num[j][i]=1;
            }
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<i;j++)
        {
            if(i!=j&&num[i][j])
            {
                dp[i]=max(dp[i],dp[j]+d);
            }
        }
        ll ans=0;
        for(int i=1;i<=n;i++)
            ans=max(ans,dp[i]);
        if(ans==0)
            cout<<-1<<endl;
        else
        cout<<ans<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    软件工程课后作业一之30道随机四则运算程序2设计思想
    软件工程课后作业一之30道随机四则运算程序
    2015春季学期软件工程之阅读计划
    第一次冲刺 站立会议6
    第一次冲刺 站立会议5
    第一次冲刺 站立会议4
    第一次冲刺 站立会议3
    第一次冲刺 站立会议2
    第一次冲刺 站立会议1
    cnblogs用户体验
  • 原文地址:https://www.cnblogs.com/xxffxx/p/11795867.html
Copyright © 2011-2022 走看看