趣味两题-(简单追及问题、两直线相交问题)
问题 F: 逃出湖心(数学题)
时间限制: 1 Sec 内存限制: 32 MB
提交: 65 解决: 20
[提交][状态][讨论版]
题目描述
一日,话说0068与***泛舟湖上。忽见岸边出现他的一大敌人elnil。0068当然不想落入elnil的魔爪,于是他就得想办法逃脱。
这个湖是一个很规则的圆形,半径为R。此时0068正好在圆心位置。小船在湖中的速度为 V1,0068和elnil在岸上的速度都为V2。也就是说,如果0068在刚上岸的时候没被抓到,则他可逃脱。在任意时刻,0068和elnil都可以朝任何方向移动,但是0068不能一直呆上船上(会饿死的),elnil不能下水(他不会游泳)。假设0068和elnil都非常聪明,总能做对自己最有利的事情,而且两个人的体力都是无限的。
请问,0068最终能不能逃脱elnil的魔爪?
输入
本题目包含多组测试。请处理到文件结束。
每组测试包含三个整数,R,V1,V2。
输出
对于每组数据,如果0068能够安全逃脱,输出Yes,否则输出No。
数据不会出现正好抓到的情况,所以你可不用太考虑临界点。
样例输入
100 10 20
100 10 50
样例输出
Yes
No
解题思路:
人一开始在圆心,怪物在岸上
人若要成功脱离,就得找到从水中成功上岸的最短距离
现在,人在圆心,怪物在B点,A点为B点相对于圆心的对称点
那么人如果此时向A点运动,怪物B便绕园做圆周运动
但此种方法并非人从水中成功上岸的最短距离。
设想,当人从圆心往岸边运动,直到人的角速度Ω人=Ω怪物时,假设人此时在C点
那么此时人和怪物作角速度相同的圆周运动
但当,人的速度快了那么一点点的时候,此时
人到了C点关于原点的对称点,怪物在B点
那么此时人只要往A点运动 便是人从水中成功上岸的最短距离。
代码便是:
1 #include <stdio.h> 2 #define PI 3.1415926 3 4 int main() 5 { 6 float r,v1,v2,t1,t2,rr; 7 while(scanf("%d%d%d",&r,&v1,&v2)!=EOF) 8 { 9 rr=v1*r/v2; 10 t1=(r-rr)/v1; 11 t2=(PI*r)/v2; 12 13 if(t1<t2) 14 printf("Yes\n"); 15 else 16 printf("No\n"); 17 } 18 return 0; 19 }
问题 B: 香蕉还是相交?
时间限制: 1 Sec 内存限制: 64 MB
提交: 936 解决: 143
[提交][状态][讨论版]
题目描述
小菜最喜欢吃香蕉啦~所以千万别在小菜面前提香蕉两字,不然他肯定缠着问你要~哈哈~。What?“相交”也读作“香蕉”,好吧,那我们就慷慨点吧,来算算下面的问题有没有小菜喜欢的东西。
输入
每组数据为两行,包含8个整数,分别表示四个坐标,(X1,Y1)至(X4,Y4),0<=Xi,Yi<=1000,前两个坐标和后两个坐标分别确定一条直线,计算这两条直线是否相交?
输出
两条直线若相交,输出Yes,若不相交,输出No,每个实例输出为一行
样例输入
1 1 2 2
2 1 3 2
1 1 2 2
2 1 3 3
样例输出
No
Yes
解题思路:
如果两条直线重合呢?算是相交
如果一条直线斜率存在另一条不存在呢?
如果两条直线斜率都不存在呢?
请看代码:
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 int x1,y1,x2,y2,x3,y3,x4,y4; 6 while (scanf("%d%d%d%d",&x1,&y1,&x2,&y2)!=EOF) 7 { 8 scanf("%d%d%d%d",&x3,&y3,&x4,&y4); 9 10 int d1=(y2-y1)*(x4-x3);//判断两条直线斜率是否相等,和斜率不存在时判断两直线是否平行 11 int d2=(x2-x1)*(y4-y3); 12 13 int d3=(y3-y1)*(x2-x1);//判断两条直线是否重合 14 int d4=(x3-x1)*(y2-y1); 15 if (d1 == d2&&d3 !=d4) 16 printf("No\n"); 17 else printf("Yes\n"); 18 } 19 return 0; 20 }