Keiichi Tsuchiya le roi de la dérive

A --Keiichi Tsuchiya le roi de la dérive

Lien du sujet: Jie Suanke

répondre

Il y a deux situations: la première: la courbe peut accueillir complètement le rectangle; la seconde: la courbe ne peut pas accueillir complètement le rectangle.

Le premier est relativement simple et le théorème de Pythagore peut obtenir le résultat.

La deuxième méthode doit être prudente. Le problème est la largeur de la courbe. Selon la première méthode, le résultat sera relativement grand, vous devez donc soustraire un petit excès.

La méthode spécifique est illustrée dans la figure:
Premier cas
Deuxième cas

Code AC

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>

using namespace std;
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define mmc(A, tree) memcpy(A, tree, sizeof(tree))
#define INF (0x3f3f3f3f)
#define mod (ull)(1e9+7)
const double PI = (acos(-1.0));
typedef pair<int, int> P;

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    int T;
    scanf("%d", &T);
    double a, b, r, d;
    while (T--) {
        scanf("%lf%lf%lf%lf", &a, &b, &r, &d);
        double dd = d * PI / 180.0;
        double w = sqrt(((a + r) * (a + r)) + b * b);
        double t = acos((a + r) / w);
        if (t - dd <= 0) {
            printf("%.12f\n", w - r);
        } else {
            double tt = (t - dd);
            double c = 2 * w * sin(tt / 2);
            tt = (PI - tt) / 2;
            double p = c * cos(tt);
            printf("%.12f\n", w - p - r);
        }
    }
    return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_45934120/article/details/108134526
conseillé
Classement