本帖最后由 轻舟过 于 2012-7-4 20:28 编辑
原题在这里http://codeforces.com/problemset/problem/203/D
如果做出来可以去提交
小朋友站在(a/2, m, 0)的位置,以(vx, vy, xz)的速度扔出一个球,他的两边是墙壁(ZOY平面,过(a, 0, b)与ZOY平行的平面),上面和下面是天花板(过(0, 0, b)与XOY平行的平面)和地板(XOY平面),球接触到天花板、地板、墙壁都会发生弹性碰撞,能量守恒,球可以忽略大小看成质点,不计重力。问第一次与XOZ平面(墙)的碰撞点是什么?
输入:
第一行为a, b, m三个整数 (1 ≤ a, b, m ≤ 100)
第二行为vx, vy, vz三个整数(|vx|, |vy|, |vz| ≤ 100, vy < 0, vz ≥ 0)
输出:
输出碰撞点的坐标(x0, 0, z0)中的x0和z0,与答案相差不超过1e-6的才会被认为是正确答案。
样例输入1:
7 2 11
3 -11 2
样例输出1:
6.5000000000 2.0000000000
样例输入2:
7 2 11
4 -3 3
样例输出2:
4.1666666667 1.0000000000
把空间镜像延拓一下就行#7134!脑补lv5
[mw_shl_code=c,true]#include <stdio.h>
int main() {
int a, b, m, vx, vy, vz;
double x0, z0, time;
scanf("%d %d %d", &a, &b, &m);
scanf("%d %d %d", &vx, &vy, &vz);
time = - (double) m / vy;
x0 = (double) a / 2 + vx * time;
x0 = x0 > 0 ? x0 : -x0;
z0 = vz * time;
while (x0 >= 2 * a)
x0 -= 2 * a;
while (z0 >= 2 * b)
z0 -= 2 * b;
x0 = x0 > a ? 2 * a - x0 : x0;
z0 = z0 > b ? 2 * b - z0 : z0;
printf("%.10f %.10f\n", x0, z0);
return 0;
}
[/mw_shl_code]
[查看全文]
好久没用C++了
写个C++的....
[mw_shl_code=cpp,true]#include "stdafx.h"
#include *本站禁止HTML标签噢*
#include "Math.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
double a,b,m,x,y,z;
cin >> a >> b >> m >> x >> y >> z;
double time = abs(m) / abs(y);
double xt = abs(time * x / (a / 2));
int xit = (int)xt;
double xdt = (xt - xit) * (a / 2);
double dx = 0;
switch ((int)xt % 4)
{
case 0: dx = xdt; break;
case 1: dx = a / 2 - xdt; break;
case 2: dx = 0 - xdt; break;
case 3: dx = 0 - (a / 2 - xdt); break;
}
dx += a / 2;
double zt = abs(time * z / b);
int zit = (int)zt;
double zdt = (zt - zit) * b;
double dz = 0;
switch ((int)zt % 2)
{
case 0: dz = zdt; break;
case 1: dz = b - zdt; break;
}
cout<<dx<<dz<<endl;
cin>>x;
return 0;
}[/mw_shl_code]
[查看全文]
