[GYM101173K] CERC 16 C.Convex Contour 计算几何

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[GYM101173K] CERC 16 C.Convex Contour 计算几何相关的知识,希望对你有一定的参考价值。


题目大意:给定一个字符串序列,不同的字符代表不同的形状(包括等边三角形、矩形、圆形)。按字符串书顺序放置这些图形,求包围这些图形所需轮廓线的长度。

思路:容易发现对于左起第一个矩形之后的轮廓线到右起倒数第一的矩形之间的轮廓线是水平的。那么我们首先从左侧开始找第一个矩形和最后一个矩形,计算中间所夹的长度。然后单独讨论两端的长度。

一个难点在于,三角形到圆的连线是与圆相切的。因此轮廓线上有一段长度是圆弧。那么我们就需要求出圆心角。最容易理解的方式是建系设点,然后推导出公式,利用库函数的反三角函数求出角度即可。

#include <bits/stdc++.h>
using namespace std;
const double pai = 3.14159265358979;
char s[25];
double ans;

signed main()
int n = 0, fir = 0, last = 0; cin >> n;
getchar();
for (int i = 1; i <= n; i++) s[i] = getchar();
for (int i = 1; i <= n; i++)
if (s[i] == C || s[i] == S) fir = i; break;

for (int i = n; i >= 1; i--)
if (s[i] == C || s[i] == S) last = i; break;
if (n == 1)
if (s[1] == T) ans = 3;
if (s[1] == C) ans = pai;
if (s[1] == S) ans = 4;
printf("%.9lf", ans);
return 0;

if (fir)
if (last - fir > 1) ans += (last - fir - 1) * 2;
if (fir >= 2)
ans += 2;
for (int i = 2; i < fir; i++) ans += 1;
double dis = 0.5 + (fir - 2), dis0 = sqrt((fir - 1) * (fir - 1) + (sqrt(3) / 2 - 0.5) * (sqrt(3) / 2 - 0.5)), d0 = sqrt(dis0 * dis0 - 0.25);
double d1 = pai / 2 - asin(d0 / dis0) - asin((sqrt(3) / 2 - 0.5) / dis0);
if (s[fir] == C) ans += d0 + d1 / 2;
else ans += sqrt(dis * dis + ((1 - sqrt(3) / 2) * (1 - sqrt(3) / 2)));


if (last < n)
ans += 2;
for (int i = n - 1; i > last; i--) ans += 1;
double dis = 0.5 + (n - last - 1), dis0 = sqrt((n - last) * (n - last) + (sqrt(3) / 2 - 0.5) * (sqrt(3) / 2 - 0.5)), d0 = sqrt(dis0 * dis0 - 0.25);
double d1 = pai / 2 - asin(d0 / dis0) - asin((sqrt(3) / 2 - 0.5) / dis0);
if (s[last] == C) ans += d0 + d1 / 2;
else ans += sqrt(dis * dis + ((1 - sqrt(3) / 2) * (1 - sqrt(3) / 2)));

if (fir == last)
if (fir == 1 || fir == n)
if (s[fir] == S) ans += 3;
else ans += (pai / 2 + 0.5);

else
if (s[fir] == S) ans += 2;
else ans += 1;


else
if (fir == 1) ans += (s[fir] == S ? 3 : pai / 2 + 1);
else ans += (s[fir] == S ? 2 : 1.5);
if (last == n) ans += (s[last] == S ? 3 : pai / 2 + 1);
else ans += (s[last] == S ? 2 : 1.5);


else ans = 5 + (n - 2) * 2;
printf("%.11lf", ans);
return 0;


以上是关于[GYM101173K] CERC 16 C.Convex Contour 计算几何的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4052 [CERC2013]Magical GCD

Ubuntu 16.04 安装 mujoco, mujoco_py 和 gym

Codeforces Gym 101190 NEERC 16 .L List of Primes(递归)

2021-5-16 周赛 C-Cats Codeforces Gym 102875C

2021-5-16 周赛 C-Cats Codeforces Gym 102875C

2021-5-16 周赛 C-Cats Codeforces Gym 102875C