南邮 OJ 1180 H - 管道小球

来源:互联网 发布:win10软件锁怎么设置 编辑:程序博客网 时间:2024/05/20 08:22

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);}






0 0