三边升序后只需判断短边之和是否严格大于最长边。
OJ: roj
题目 ID: 1054
难度:入门
标签:入门条件判断数学python
创建: 2026-09-29 16:34
更新: 2026-10-04 23:37
题目描述
给定三个正整数表示三条线段长度,判断它们能否构成三角形:能输出 yes,否则输出 no。
输入一行三个正整数,空格分隔;输出 yes 或 no。
样例输入 3 4 5,样例输出 yes。
思路
把三边升序排序,定出最长边。此时三角形判定只剩下一条不等式:两条短边之和必须严格大于最长边;取等表示三边共线退化,应输出 no。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 16:34
# update_at: 2026-09-29 16:34
import sys
def solve() -> None:
# 三边升序排列后只需一次比较:升序解包把"最长边"这个名字直接写进代码
a, b, c = sorted(map(int, sys.stdin.buffer.read().split()))
can_form_triangle = a + b > c # 短边之和严格大于最长边;取等即退化,仍不成三角形
print("yes" if can_form_triangle else "no")
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-04 23:37
* update_at: 2026-10-04 23:37
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll side[3]; // 三条线段长度,读入后升序排列
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
for (int i = 0; i < 3; i++) {
cin >> side[i];
}
sort(side, side + 3); // 升序后 side[2] 是最长边
// 两条短边之和严格大于最长边即构成三角形;取等表示共线退化,仍输出 no。
if (side[0] + side[1] > side[2]) {
cout << "yes" << "\n";
} else {
cout << "no" << "\n";
}
return 0;
}