【计算几何】 三角形相关性质

目录

一. 构成性质

1. 边性质

2. 等腰性质

3. 最大边性质

4. 费马大定理和勾股数

二. 计算性质

1. 正弦定理

2. 余弦定理

3. 面积公式

4. 海伦公式

5. 和差角公式

5. 二倍角公式

6. 和差化积公式

7. 化简公式

三. 例题分析

1. 三角形数量

2. HDU - 4486


一. 构成性质

1. 边性质

三角形的任意两边之和大于第三边,任意两边之差小于第三边。若满足其一,则另一个一定满足。

2. 等腰性质

三条相等的边一定能够成等边三角形;两条相等的边a,只要a>b/2,即可构成等腰三角形;特别的,当a=b时成为等边三角形。

3. 最大边性质

当已知最大边c,只要a+b>c一个条件即可构成三角形。

4. 费马大定理和勾股数

费马大定理和勾股数icon-default.png?t=N7T8https://blog.csdn.net/qq_40772692/article/details/82079020

二. 计算性质

1. 正弦定理

2. 余弦定理

3. 面积公式

4. 海伦公式

5. 和差角公式

5. 二倍角公式

6. 和差化积公式

7. 化简公式

三. 例题分析

1. 三角形数量

Problem Description

给出数字n,在1~n当中选择三个不同的数字构成三角形,问最多能够成多少个三角形

        假设C(x) 表示当最大边为x时,所能够成的三角形的个数。设剩下两边为a、b,则只要a+b>x即可构成三角形,则  x-b < a < x,现在x已知,b∈[1,x-1]:

当b==1:无解;

当b==2:a=x-1;

当b==3:a=x-1,a=x-2;

.......

当b==x-1时:a有x-2个解;

        由求和公式可知:所有的解共 0+1+2+3+......+x-2 = (x-2)*(x-1)/2个;由于题目要求三个数字互不相同,而a,b在 [x/2+1,x-1]之间存在相等,所以结果 - (x-1)/2;由于a,b不与x相等,但是a,b,存在重复现象,所以每个三角形查了两遍,故结果再/2 即 C(x) = ((x-2)*(x-1)/2 - (x-1)/2)/2;

        这只是最大变长为x的时候结果,设F(x)为1~x的所有结果则:F(x) = F(x-1) + C(x);

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int maxn = 1000000 + 7;
LL Triangle[maxn];
void init(){
   Triangle[3] = 0;
   for(LL i = 4;i<maxn;i++){
      Triangle[i] = Triangle[i-1] + ((i-1)*(i-2)/2 - (i-1)/2)/2;
   }
}
int main()
{
    int n;
    init();
    while(scanf("%d",&n)!=EOF){
        if(n<3)break;
        printf("%lld\n",Triangle[n]);
    }
    return 0;
}

2. HDU - 4486

Problem Description

给你长度n,求a,b,c构成的三角形个数,其中a+b+c = n且若a!=b!=c,个数统计为2

(1)若n%3==0:则说明存在三边相等的,ans+=1;

(2)求两边相等的:a , a , b   (b<n/2) , 枚举b,若(n-b)%2==0&&(n-b)/2!=b则存在一个等腰三角形,且这样的必能构成一个三角形;

(3)求三边不等的:设最大边为c(c<n/2) , 则另外两条边能取的最大值为b = c-1,最小为a = n - b - c;则下一次取值就为b = c-2,a = n - b - c...

比如n = 23,c = 11时:b = 10,c = 2 ; b = 9,c = 3; b = 8,c = 4; b = 7;c = 5;共四个  (b-c)/2 + 1(加上10,2) - 1(减去6,6);

比如n = 24,c = 11时:b = 10,c = 3;b = 9,c = 4; b = 8,c = 5; b = 7,c = 6;共四个    (b-c)/2 +1(加上10,3) 不减了(没有相等);

所以:若(b-c)&1则ans+=(b-c)/2+1;否则 ans+=(b-c)/2;

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int N,P;
int ThreeTriangle(int n){
   if(n%3==0)return 1;
   else return 0;
}
int TwoTriangle(int n){
   int a,sum = 0;
   if(n%2==0)a = 2;
   else a = 1;
   for(;a<=(n-1)/2;a+=2){
       if((n-a)/2!=a){
          sum++;
       }
   }
   return sum;
}
int OneTriangle(int n){
   int sum = 0;
   for(int a = (n-1)/2;a>=2;a--){
      int b = a-1;
      int c = n-a-b;
      if(c>=a||c>=b)break;
      if((b-c)&1)sum+=2*((b-c)/2+1);
      else sum+=(b-c);
   }
   return sum;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&P,&N);
        int ans = 0;
        ans+=ThreeTriangle(N);
        ans+=TwoTriangle(N);
        ans+=OneTriangle(N);
        printf("%d %d\n",P,ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿阿阿安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值