83 条题解
-
38
三角形的特性
我们先看题目:
小X很喜欢三角形,原因之一是三角形具有稳定性。 也就是说,给定三角形的三条边长,它的形状也随之确定了。 现在小X想画一个三条边长都是正整数的三角形, 其中两条边的长度分别是a和b,第三条边的长度还没有确定。 小X想知道他能画出多少种不同的三角形。
这里面有很多废话,精简一下,就是:
给出三角形的两条边,求,第三边有几种可能(边长皆为正整数)。
枚举
有不少人第一步可能就是想到了枚举,但是,我觉得这道题用枚举和用O(1)的算式没差,都运用到了三角形的两个特性。
三角形的特性
- 三角形的两边之和,大于第三边。
- 大意就是,三角形有a1、a2、a3三条边,它们符合a1+a2>a3,a1+a3>a2,a2+a3>a1。这也很好理解,如: 这个三角形的三条边就符合上面的条件,所以他能组成三角形。
- 但如果a1+a2<=a3,那么就会出现a1和a2成了一条直线,都难以够到a3,无法组成三角形。
- 三角形两边之差,小于第三边。三角形有a1、a2、a3三条边,它们符合abs(a1-a2)<a3,abs(a1+a3)<a2,abs(a2-a3)<a1。其中abs是绝对值的意思。
- 这个也很好解释,如果a1-a2>=a3,那么a3+a2就会<=a1,这不符合上面这个性质。
题目 思路
回到题目,我们已经知道,只要符合上面这两个特性,就能组成三角形。而且,符合特性的数是有规律的,比如,如果3,8都可以当第三边,那么4、5、6、7也都可以当成第三边。
-
利用这个特性,我们就可以有思路。
- 求出符合条件的最小值。
- 求出符合条件的最大值。
- 在这区间内的所有数,都是符合条件的。所以,我们用最大值-最小值+1就可以得出答案了。
-
我们可以根据特性一计算,算出第最大值就是a1+a2-1。
-
根据特性二,我们可以算出最小值是abs(a1-a2)+1。
-
之后我们根据第三步,可能取值的个数是(a1+a2-1)-(abs(a1-a2)+1)。
-
简化后可的AC代码
AC代码(求赞):
#include <bits/stdc++.h> using namespace std; int main() { int a,b; cin>>a>>b;//输入a,b。 cout<<(a+b)-abs(a-b)-1; //简化后的算式。 return 0; }
- 三角形的两边之和,大于第三边。
-
6
三角形的特性
三角形有两个特性
- 两边之和大于第三边。
- 两边之差小于第三边。
- 这几个特性对于任何三角形的任何边,都适用。
- 那么怎么理解呢?
(1)两边之和大于第三边
- 这个其实还是很好理解的,如果等于的三边的话,整个三角形就会变成一根棍子。三条边紧贴在一起。
(2)两边之差小于第三边
- 这也很好理解,假设有两根棍子,一根长10,一根长6,如果第三边为4,是两边之差的话,那么4+6=10,违反了上一个特性,自然就错了。
懂了这些之后,题目就简单了。
思路:
- 算出两边之和。
- 算出两边之差。
- 用差减和,再减上1,这就是符合特性的所有整数。如和为10,差为2,那符合的就是3、4、5、6、7、8、9,一共10-2+1个数。
AC代码(求赞)
#include <bits/stdc++.h> using namespace std; int main() { int a,b; cin>>a>>b; cout<<(a+b)-abs(a-b)-1;/*用和减去差,再减1。 abs()求括号里的数的绝对值的意思, 自然数的绝对值是他本身,负数就是他去掉负号。因为如果b>a那么a-b会是负数。 */ return 0; }
-
2
用数学方法来分析简化
首先要知道满足围成三角形的三边关系:
任意两边之和大于第三边 任意两边之差小于第三边
那么已知两边,求第三边有几种结果,便可得出下列式子:
设三边分别为a,b,c,(已知a,b)
a+b>c>a-b>=0
稍微变下形
因为要求a-b>0,而a,b大小关系不定,所以产生绝对值(分类讨论)
变成下列式子
(a+b)-|a-b|>c>0
继续化简
① 当a>=b时:
2b>c>0
因为b,c为整数
所以c有2b-1种值
②当a<b时:
2a>c>0
因为a,c为整数
所以c有2a-1种值
*(tips:a-b=0,也就是a=b属于特殊情况,①②中均可,在此将其归类于①中)
到此,我们边分析出了三角形任意两边长度与第三边取值个数的关系,下面上代码
#include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; if (a >= b) //判断a,b大小 { cout << 2 * b - 1; } else { cout << 2 * a - 1; } //直接套用公式 return 0; }
(tips:如果你知道abs也可以不使用if来判断正负,在此不赘述)
第一次写题解,如有错误欢迎指正
信息
- ID
- 522
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 18999
- 已通过
- 3895
- 上传者