最长线段(几何证明题)

2024-02-05 10:48
文章标签 最长 几何 线段 证明题

本文主要是介绍最长线段(几何证明题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最长线段(chord.pas/chord.in/chord.out)

(LYOI信息学综合模拟20090321Problem 1)
问题描述
给定两个圆各自的圆心坐标和半径长。过其中一个交点作直线,该直线与圆的另外两个交点分别为A、B。线段AB最长是多少?
输入数据
第一行有三个用空格隔开的整数x1,y1,r1,依次表示第一个圆的圆心坐标和半径;
第二行有三个用空格隔开的整数x2,y2,r2,依次表示第二个圆的圆心坐标和半径;
输入数据保证两圆相交。
输出数据
输出AB的最大长度。你的输出需要保留6位小数。
输入样例
5 4 4
-3 2 5
输出样例
16.492423
数据规模
对于30%的数据,x1=y1;
对于50%的数据,r1=r2;
对于100%的数据,输入数据在integer范围内。
思路
这个题其实我是靠直觉做的,然后它的辅助证明类似于JSQ大佬的方法,我自己造了几组圆然后算了算,发现是当这条线段垂直于两交点连线时最短,然后利用一组相似三角形即可求出解的比值大概是2:1,所以就是圆心距的2倍。

正解思路是用几何证明证明出这个答案是对的。
这里写图片描述
求证:经过相交两圆的一个交点的那些直线,被两圆所截得的线段中,平行于连心线的那一条线段最长。
分析:如图,PQ∥OO′,要证明PQ最长,只须证明PQ大于过A点的任意一条不平行于OO′的割线P′Q′,这是证明与圆的弦有关的问题,因此过O、O′分别作PQ、P′Q′的垂线,垂足分别为C、D;C′、D′。由垂径定理知AC= AP、AD= AQ,所以CD= PQ。同理C′D′= P′Q′,又OO′=CD,于是问题转化为证明OO′> C′D′,而OO′D′C′为直角梯形,显然有OO′> C′D′。从而问题可证。

然后放上比较简单的代码。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
double x1,x2,y,y2,r1,r2;
int main()
{freopen("chord.in","r",stdin);freopen("chord.out","w",stdout);scanf("%lf%lf%lf",&x1,&y,&r1);scanf("%lf%lf%lf",&x2,&y2,&r2);printf("%.6lf",2*sqrt((x1-x2)*(x1-x2)+(y-y2)*(y-y2)));return 0;
}
/*
5 4 4
-3 2 5
*/

妹子图以后再补上。。。
这里写图片描述

这篇关于最长线段(几何证明题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680667

相关文章

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while