您的位置:首页 > 其它

南邮 OJ 1180 H - 管道小球

2015-08-05 10:29 288 查看


H - 管道小球

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 64            测试通过 : 18 

比赛描述

    有一个截面为长方形的管道,不放假设在笛卡尔坐标系中,该管道的中轴线恰好为x轴,管道的入口位于平面x=0,管道出口位于x=X。

    管道界面的长为a,宽为b,且长边平行于y轴,宽边平行于z轴。

    假设在管道的入口处(0,0,0)有一个半径可忽略并且不计重力的小球,现在给小球一个初速度v=(vx,vy,vz)使得小球运动。假设当小球与管道壁相碰,小球会完全的反弹。请问小球能否到达出口截面?截面坐标是什么?

输入

一行,包含6个整数:a,b,X,vx,vy,vz(0<b<a<10000,0<=x<=10000,-10000<=vx,vy,vz<=10000)

输出

若小球能到达管道出口截面,则输出一个实数:X,Y,Z,用单个空格隔开,表示到达是的坐标,否则,输出“impossible”,所有结果保留3位小数。

样例输入

10 10 10 10 0 0

样例输出

10.000 0.000 0.000

提示

undefined

题目来源

NJU 7th ACM contest

#include<iostream>
int main(){
// freopen("test.txt","r",stdin);
double a,b,X,vx,vy,vz,t,disy,disz;
scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&X,&vx,&vy,&vz);
if(vx==0){
if(X==0){
printf("%.3lf %.3lf %.3lf\n",X,0,0);
}else{
printf("impossible\n");
}
return 0;
}
t = X/vx;
if(t<0){
printf("impossible\n");
return 0;
}
disy = vy*t;
while(disy<-a/2){
disy += 2*a;
}
while(disy>3*a/2){
disy -= 2*a;
}
if(disy>a/2){
disy = a-disy;
}

disz = vz*t;
while(disz<-b/2){
disz += 2*b;
}
while(disz>3*b/2){
disz -= 2*b;
}
if(disz>b/2){
disz = b-disz;
}
printf("%.3lf %.3lf %.3lf\n",X,disy,disz);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息