QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#166628#7110. Kuririn MIRACLEucup-team045AC ✓213ms4356kbC++201.9kb2023-09-06 15:42:292023-09-06 15:42:30

Judging History

你现在查看的是最新测评结果

  • [2023-09-06 15:42:30]
  • 评测
  • 测评结果:AC
  • 用时:213ms
  • 内存:4356kb
  • [2023-09-06 15:42:29]
  • 提交

answer

#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
#include<iomanip>
using namespace std;
using LL = long long;
const double PI = acos(-1);
double v, R, d;

double f(double x){
    double sinx = sin(x);
    return 1 / v / (sqrt(sinx * sinx + 3) - sinx);
}

const double eps = 1e-9;

double simpson(double l, double r){
    double mid = (l + r) / 2;
    return (r - l) * (f(l) + 4 * f(mid) + f(r)) / 6;
}

double asr(double l, double r, double eps, double st) {
    double mid = (l + r) / 2;
    double sl = simpson(l, mid);
    double sr = simpson(mid, r);
    if (abs(sl + sr - st) <= 15 * eps)
        return sl + sr + (sl + sr - st) / 15;
    return asr(l, mid, eps / 2, sl) + asr(mid, r, eps / 2, sr);
}

double asr(double l, double r) {
    return asr(l, r, eps, simpson(l, r));
}

int main(){

#ifdef LOCAL
    freopen("data.in", "r", stdin);
    freopen("data.out", "w", stdout);
#endif

    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(20);

    int T;
    cin >> T;
    while(T--){
        cin >> v >> R >> d;

        auto check = [&](double mid){
            double l = d - v * mid;
            if (l + eps < 4 * R) return false;
            double a = PI - acos(2 * R / (l - 2 * R));
            double px = R * 2 - cos(a) * R * 2;
            double py = sin(a) * R * 2;
            double dis = sqrt((l - px) * (l - px) + py * py);
            double ans = asr(0, a) * R * 2 + dis * f(a);
            return ans <= mid;
        };

        double l = 0, r = (d - 4 * R) / v - eps;
        double ans = d / v;
        if (l <= r){
            for(int i = 0; i < 100; i++){
                double mid = (l + r) / 2;
                if (check(mid)) r = mid;
                else l = mid;
            }
            if (check(r)) ans = min(ans, r);
        }
        cout << ans << '\n';
    }

}

这程序好像有点Bug,我给组数据试试?

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 4224kb

input:

1
2.00 3 30.0

output:

8.31057993390141724888

result:

ok found '8.3105799', expected '8.3105799', error '0.0000000'

Test #2:

score: 0
Accepted
time: 20ms
memory: 4184kb

input:

100
8.66 6.05 71.59
8.44 8.67 82.55
4.23 9.68 24.74
6.63 9.95 7.45
1.2 7.27 97.55
2.08 2.94 31.61
8.48 5.56 20.16
7.35 5.55 52.48
1.35 8.15 51.23
3.88 9.02 72.37
7.03 1.97 57.03
1.78 4.44 93.44
5.5 6.11 52.94
1.09 9.64 69.01
1.01 3.54 16.78
1.63 4.55 44.06
5.82 5.51 5.92
5.62 2.93 76.01
4.75 4.43 73...

output:

4.45783712273524912462
5.48836080898513500870
5.84869976359337950811
1.12368024132730015552
43.26648005352993209272
8.30549013820238712924
2.37735849056603765206
4.01548596950507086234
37.94814814814814241117
18.65206185567010521709
4.15512364356937347054
27.17896300707924694962
9.625454545454545041...

result:

ok 100 numbers

Test #3:

score: 0
Accepted
time: 213ms
memory: 4356kb

input:

1000
7.52 6.68 80.67
5.34 6.82 45.75
3.57 6.35 22.35
9.55 3.65 31.38
9.37 5.73 40.42
1.83 8.38 82.97
4.86 6.13 9.45
3.88 5.34 84.19
6.49 4.15 85.24
6.51 7.23 42.97
3.0 5.98 57.53
9.35 2.76 69.07
6.76 9.16 91.24
2.98 9.89 49.2
9.16 3.85 66.14
1.84 3.03 37.43
8.01 5.04 50.98
4.05 9.86 4.76
5.4 5.49 60...

output:

5.77088264925039151620
8.56741573033707837226
6.26050420168067311977
3.28586387434554927367
4.31376734258271099520
25.17648417203901090033
1.94444444444444419773
11.40629961636972922179
6.80719120563112323197
6.60061443932411684443
10.72771256081806612315
3.80019784481176081670
7.4844843026256615559...

result:

ok 1000 numbers

Extra Test:

score: 0
Extra Test Passed