【2011.12.10普及模拟】泽泽在巴西

在一场足球比赛中,泽泽必须找到避开敌人拦截的最短射门路径。通过使用Floyd算法,泽泽团队可以计算出从任意球员到球门的最短距离,同时避免被足球流氓阻挡。

题目描述
泽泽帮助了英国某街道尽量减少酸雨的伤害,街道办主任非常感激他,就把他领到一扇门前,告诉他这扇门能通往好地方,具体好到什么程度要看泽泽人品。泽泽毫不犹豫地走了进去……

泽泽来到了足球王国——巴西。这可是个好地方,泽泽看来人品攒了不少了。这里大街小巷都在踢足球,其乐无穷。

突然,泽泽被一个人拎了起来,一看,是个足球流氓。他后面跟了一大群足球流氓,正虎视眈眈地看他。他们要求和泽泽比赛,输了就要揍他。

没办法,泽泽硬着头皮和足球流氓另外掳来的几个人一起组建了一只队伍,和足球流氓队比赛。

比赛开始,泽泽队率先发球。泽泽观察了四周,想怎么才能用最短的时间射门呢?


(以上都是废话)
射门的时间为距离2,而传球的时间是距离1。所以泽泽想找一条用时最少的射门路径,来打败足球流氓。

足球流氓当然不会袖手旁观,他们会拦截。当泽泽队伍中的传球人、被传球人之间有某足球流氓并且他们在同一直线上时,传球不会成功,即不能这样传球。比如A(1,2)想传球给B(7,8),中间有个足球流氓C(3,4),则他们在同一直线,传球不成功。射门不受足球流氓影响。

输入
第1行4个整数x0,y0,n,m。x0,y0表示球门的坐标,n表示泽泽队伍有几个人,m表示足球流氓有几个人。

接下来的n行,分别有2个整数,表示泽泽球队的球员坐标。其中最前面的2个整数是泽泽的坐标。球一开始在泽泽脚下。

接下来的m行,分别有2个整数,表示足球流氓的球员坐标。

保证不会有2个人坐标相同。

输出
输出一个整数,是最短时间四舍五入取整后的结果。

样例输入
0 0 5 2
20 20
27 -14
0 16
-7 -9
23 38
22 24
3 0

样例输出
52

数据范围限制

提示
【样例说明】

泽泽(20,20)传给3号队员(0,16),3号队员再射门(0,0),总共用了52。

【限制】

对于80%的数据,n<=10,m<=5

对于100%的数据,n<=300,m<=100

题解:

题目方法:

Floyd(弗洛伊德——最短路

具体方法:

枚举每两个球员之间传球的距离,然后一波弗洛伊德,就搞定。

还有一点细节,就是就是如何判断两个球员之间能否传球,也就是两个球员之间有没有足球流氓的球员。
很多人就是用斜率做的,然后错了,我们来分析原因:图来自2019jz欧家洋
红点为我方球员,蓝点为敌方球员,如果敌方_3在我方_1和我方_4的延长线上,就会出错。
所以我们就要判断它是否在绿色方框内。
判断代码:

			for(int k=1;k<=m;k++){
				if((lx[k]-x[i])*(ly[k]-y[j])==(lx[k]-x[j])*(ly[k]-y[i])&&min(x[i],x[j])<=lx[k]&&lx[k]<=max(x[i],x[j])&&min(y[i],y[j])<=ly[k]&&ly[k]<=max(y[i],y[j]))
				{bj=1;break;}
			}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值