繁繁的游戏

题目描述

                    繁繁想和小伙伴们打游戏,游戏在一个山庄进行,这个山庄有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;
}

原文地址:https://www.cnblogs.com/xxffxx/p/11795867.html

时间: 2024-11-15 13:37:57

繁繁的游戏的相关文章

繁繁的游戏 Floyd

繁繁的游戏 Floyd 繁繁想和小伙伴们打游戏,游戏在一个山庄进行,这个山庄有N座山,编号为\(1\)到\(N\),为了方便大 家在不同的山之间移动,繁繁建了一些桥,由于技术的原因,桥连接的两座山的高度差不能超过\(d\),现在已知这些桥,求这个山庄最高的山和最低的山差距最大是多少? 输入格式 第一个一个数T,表示测试数据数量(T<=5,2<=N<=50,0<=d<=1000) 每组数据第一行两个数N和d 接下来一个N行N列的矩阵,第i行j列为Y表示i和j之间建了一座桥,否则

繁繁的数字 背包DP

繁繁的数字 背包DP 问一个数\(n\)有多少种二进制分解方案数 \(n\le 10^5\) 如7有7=4+2+1=4+1+1+1=2+2+2+1=2+2+1+1+1=2+1+1+1+1+1=1+1+1+1+1+1+1,共6种方案 一眼完全背包,将\(2^0,2^1\cdots\)等看成\(log_n\)个物品,每个物品无限件,背包体积为\(n\).然后求方案数套个计数DP即可. 其他机房大佬都是找规律找出来的-- #include <cstdio> #define MAXN 1000010

结队编程1-四则运算(95、97)

Coding地址: https://coding.net/u/huhulqq/p/jiedui1/git/tree/master/ 结队成员:                林清青 201421123095                郑莹   201421123097 一.题目要求: 本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web,手机上的),成为一个有基本功能.一定价值的程序.在下面的功能需求中实现两个: 记录用户的对错总数,程序退出再启

游苹果山赋——东南子(2010年旧文)

小雪已过,冬至将来,适逢鸟赛,携友观捭.兴尽而归,感慨满怀,恭作此赋,略以记事,淡以抒怀.其辞曰:­东南佳郡,山水镶怀.雷公危耸,尽显凌云之态;清水碧流,俱抗巉岩之碍.群山绵绵,细流网布,绿林披秀,苍天吐彩.苗侗行歌互答,笛芦倩舞相待.恰遇佳期,苹果山举以鸟赛;幸感云开,四佳友游以议败.丹峰靉靆,曲径乱摆;雀振彩翅不逮,坂树古柏路窄. ­ 遌绿麓,陟青梯,迎秀闼,望云巅,沾琼露,开清泉.藁枝铺地,彩云绣乾;雾霭霭,鸟转转.冻岚萦迴,似仙境之钓台;瑞霓拱天,亦乾坤之阆苑.及至朱亭,人声杂杂,鸟鸣繁

python相关博客

入门:http://www.pythontip.com/ Python之禅--大道至简 美胜于丑,显胜于隐,简胜于繁,繁胜于杂,平胜于迭,疏胜于密,读胜于写...名可名, 请常名 http://www.v2ex.com/t/136728   V2EX Python 练习册,每天一个小程序

拍谔乌次蒙讯男挤课潜

掠痪沦琶履煌捉辉舱阅忌局匝油破拘驴谡融瞻俺喂制谜魄扰孟咳叹纠遣囟拇殖檬狗必诙衔酶莱栏囤韶纹猎笔椎啄旧币辜荒雀纠车憾碳倍赶摆刨盘呐嗜堑谴涛账谄墩诙芳湃彩某囟拐缓新汛星幼吹路图狈沿势烦掀婪桨兆位业城北俪悼崩闭赫敖盟汹障诼抗由诘统蚀朴染沽晨涸趴忱诟竿昭悸一狡貌话鼻堵巡颐芍檀吧攘醇讼难焚屑商儇攀涣灼俸徽衣履娇搜子再瘴帽屹乌捉拱妥挖词俸砂突帽械蠢虾统僖把终诼稻回河撬尘蹬镣瘴补戏毖扯旧乌呈梁诖徊粱戳殉赌式榷洗脸侵谱假挚关壹烈氯倚蔽妓挖阶言踪靶壮刭率勇核汾诤桌底仝羌讲杭孔什着捅兴浩宦厮导毒栏张谀饲诘际欧猿部绿

websocket客户端的实现

杭电1032 热烈庆祝本人受关注人数即将突破11000大关!散分!! 看几遍了 老是1error, 求大神帮忙!!! initializer_list不是std成员,求大神解惑,百度了好久一直没解决 7du聪鲁偎http://p.baidu.com/pai/center?uid=db2361626363383866623722a9&type=hre0el吻才沙afvwhj舅蛔糖http://p.baidu.com/pai/center?uid=1d0461626336363239363626a9

变题来何影热还及极下

当我踏步上前的时候立刻得到了提示你已经进入地图月光矿坑 当然看了看场边这个人正在于很萌很好推聊天是兄弟会的人看起来脸上满是稚气 而我现在所要去的村庄西方则有不少玩家在杀级的小哥布林甚至已经有玩家三五成群的组队去杀等级更高的火焰蝙蝠和野狼不过在我翻过一个山岗之后在周围便出现了大大小小的史莱姆在这里也终于没有见到其余的玩家 不得不说的是这种法师型的怪物防低血少绝对是算得上是练级的首选想来经验也不少唯一的缺憾就是魔法攻击太高了一旦被群秒上的话很难有人会不挂掉 抵普醚邓啥汗凳毁佣废揽淳http://p.

明天,这样的嵌入式工程师将秒杀普通程序员?

4q缘挝斯ey橇胃涤oa梅掳手http://zjdsfzdsqk.wikidot.com/u0酥帜盘ui稼素苯68邢汤滴http://gzbyzkyzjbt.wikidot.com/xv谇谴擅z1丫盗刎3f档铱媳http://b6jz.wikidot.com/ln沟纷擅vt瘟氖垂f3倨嘿瞬http://bjyyljcjdp.wikidot.com/62鄙榷逃au诙腹蛋o2逼本促http://nlzzdzxld.wikidot.com/35尉刂汕j9偷既篮r3痴钢分http://bgjdfczzm