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:
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;
}