NC232545. 三角碰撞(Triangle Collision)
描述
输入描述
第一行输入一个正整数
接下来行每行输入6个整数,,,,,,,。
输出描述
对于每组数据,输出一个实数表示问题的答案。
你的答案正确,当且仅当误差不超过。即只要满足 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"; } }