当前位置: 代码迷 >> 综合 >> 校赛Round2 1008 低能数学题
  详细解决方案

校赛Round2 1008 低能数学题

热度:99   发布时间:2023-12-08 11:26:44.0

Problem Description

如图,在平面直角坐标系xOy中,已知椭圆C: 以及它的左准线l:x=-2,过椭圆右焦点F的直线交椭圆于A、B两点,线段AB的垂直平分线分别交直线l和AB于点P、C,若PC=pAB,求直线AB的斜率k。

Input

输入有多组数据(约100组)。每组数据一行一个实数p,表示线段PC与AB长度的比值p(p>=2)

Output

对于每组数据,输出一行一个实数k,表示直线AB的斜率,如果有多组解,请输出最小的一个正数解(保留3位小数)

Sample Input

2
2.5
100

Sample Output

1.000
0.378
0.007


分析:
没想到时隔一年多又遇到了解几题!还是在这种情况下遇到的! <( ̄ˇ ̄)/
最后半个小时就是在做这道题,可惜没做出来~,太弱了╮(╯▽╰)╭
直接设AB直线斜率k,和椭圆方程联立消去y可得x的二次方程:
设A(x1,y1),B(x2,y2),则

PC是AB的垂直平分线,且P点的横坐标上-2,C是AB中点;可得P,C点坐标:

进而可得PC,AB的长度:

带入PC=p*AB并化简可得:

利用求根公式可解得:

难点就是计算准确性!
现场做的时候只做到求出PC,AB长度这一步,下面就不敢写了.....,其实要是有信心写下去用求根公式一下子就写出来了,╮(╯▽╰)╭
#include <stdio.h>
#include <math.h>
int main()
{freopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);double m, n, t, p, k, k1, k2;while (~scanf("%lf", &p)){n = p*p - 3;m = p*sqrt(p*p - 4);t = 9 - 2*p*p;k1 = (n + m) / t;k2 = (n - m) / t;if (k1 > 0 && k2 > 0){//需要加一个简单的判断,因为题目要求输出最小正数解k = k1 < k2 ? k1 : k2;}else{k = k1 > 0 ? k1 : k2;}printf("%.3lf\n", sqrt(k));}return 0;
}