2022summer -rating4-C sign down

链接:https://ac.nowcoder.com/acm/contest/38993/C
来源:牛客网

题目描述

大家都非常期待在这周的积分赛上见到一题计算几何,那可不能辜负大家的期待。

既然是新生积分赛,那肯定不会是一个动态闵可夫斯基和,而是一个十分简单的签到题。

我们知道蛋白质和水是生命所需,不同的生物对每一种养料的比例需求并不相同。一个生物能得到蛋白质或者水的多少正比于其到水源或蛋白质源的距离。

现在有一条直线水流和一坨蛋白质,问对于指定需求比例的生物能生存的地方的长度是多少。

输入描述:

第一行四个整数 \(x_1,y_1,x_2,y_2\) 分别描述两个点的坐标以确定水所在的直线。保证两个点不重合。
下一行两个整数 \(x_3,y_3\),描述蛋白质的位置。保证蛋白质不会在水中。
最后一行一个数 \(k (0<k<1)\),表示到蛋白质的距离与到水的距离的比值。
坐标绝对值均小于100
\(k\)至多2位小数。

输出描述:

一行一个浮点数,表示答案。
为了方便大家更好的签到,我们使用公式 \(L=2*\pi*b + 4(a-b)\)。字母具体含义当你懂得怎么做的时候就懂了(
当你答案的绝对误差或相对误差在 \(10^{-6}\)以内就被认为正确。

思路:

一眼椭圆,用焦点和焦准线之间的距离计算 \(a,b,c\) ,但是我算 \(a\) 的公式假了掉了精度一直wa

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const double pi = 3.1415926;
int n, m;
int main () {
    int x1, y1, x2, y2, x3, y3;
    double k, d;
    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
    scanf("%d%d", &x3, &y3);
    scanf("%lf", &k);
    d = (double)(abs(((y1 - y2) * x3 + (x2 - x1) * y3 + x1 * y2 - y1 * x2))) / sqrt((y1 - y2) * (y1 - y2) + (x1 - x2) * (x1 - x2));
    double a = d * k / (1 - k * k);
    double c = a * k;
    double b = sqrt(a * a - c * c);
    double ans = 2 * pi * b + 4 * (a - b);
    printf("%.10lf\n", ans);
    return 0;
}
posted @ 2022-08-10 23:55  misasteria  阅读(48)  评论(0编辑  收藏  举报