南邮 OJ 1180 H - 管道小球

本文讨论了在一个特定管道内,具有初始速度的小球如何运动并判断其是否能够到达出口截面的问题。详细解释了小球与管道壁碰撞后的反弹机制,以及通过数学计算确定小球最终坐标的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值