列表

详情


NC232545. 三角碰撞(Triangle Collision)

描述


如图所示,在一边长为L的等边三角形边框围成的区域内,放置一半径为的小球。
以等边三角形底边与该边的高线交点为坐标原点建立直角坐标系,三角形三个顶点的坐标分别为,,,小球的初始坐标为(x,y)
小球在水平方向的速度为vx每秒,竖直方向的速度为vy每秒,小球的初速度大小为。方向沿向量(vx,vy)
当小球未碰撞到等边三角形区域的边缘时,假设一开始小球位于(x,y)的位置,则经过t秒后小球将移动到的位置。


当小球碰撞到等边三角形边缘时,产生完全弹性碰撞,也就是说碰撞前后速度的大小不变,仍为
角度遵循"入射角等于反射角"的规则,如图所示角相等。
现在告诉你等边三角形边框的边长L,小球的初始坐标位于三角形内部的(x,y),小球的速度恒定为(vx,vy),问小球恰好碰撞边缘k次用时多少?

输入描述

第一行输入一个正整数T
接下来T行每行输入6个整数L,x,y,vx,vy,k,

输出描述

对于每组数据,输出一个实数表示问题的答案。
你的答案正确,当且仅当误差不超过。即只要满足 fabs(stdvalue - yourvalue) / max(1.0, fabs(stdvalue)) < 1e-4的答案均正确。

示例1

输入:

4
4000 0 1732 1000 0 1
4000 0 1732 1000 0 1000000
4000 0 1234 0 -1 1
4000 -1000 1 0 1000 925469

输出:

1.00002957
1999998.99997035
1233.99999975
1602959.32782988

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 83ms, 内存消耗: 496K, 提交时间: 2023-07-29 17:47:50

#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
const int N=300013;
typedef long long ll;
const ld pi=acosl(-1.0);

ld L,dx,dy;
ll k;
ld x,y;
ll f(ld x){
    return (ll)fabsl(floorl(x));
}
bool chk(ld t){
    ld tx=x+dx*t,ty=y+dy*t;
    return f(ty/sqrtl(3)/L+tx/L+0.5)+f(ty*2/L/sqrtl(3))+f(ty/sqrtl(3)/L-tx/L+0.5)>=k;
}

void solve(){
    cin>>L>>x>>y>>dx>>dy>>k;
    ld l=0,r=1e10,mid,ans=l;
    for(int i=1;i<=100;i++)mid=(l+r)/2,chk(mid)?r=ans=mid:l=mid;
    cout<<ans<<'\n';
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cout<<fixed<<setprecision(8);
    int T=1;
    cin>>T;
    while(T--)solve();
}

C++ 解法, 执行用时: 30ms, 内存消耗: 704K, 提交时间: 2022-01-15 01:54:34

#include<bits/stdc++.h>
using namespace std;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cout << fixed << setprecision(20);
    auto f = [&](double x)->long long{return x >= 0 ? x : -x + 1;};
    int T, L, x, y, vx, vy, k;
    for (cin >> T; T; T -= 1) {
        cin >> L >> x >> y >> vx >> vy >> k;
        double l = 0, r = 1e10;
        while (r - l > max(1.0, l) * 1e-4){
            double m = (l + r) / 2, tx = (x + vx * m) / L, ty = (y + vy * m) / L / sqrt(3);
            (f(2 * ty) + f(-tx - ty + .5) + f(tx - ty + .5) >= k ? r : l) = m;
        }
        cout << (l + r) / 2 << "\n";
    }
}

上一题