codeforces - 766B【三角形判断】
题解By: Jstyle
知识点一
要想三边满足构成三角形的条件有两个
1、任意两边之和大于第三边。
2、任意两边之差小于第三边。
知识点二
假设三边为 a, b, c 且满足 a <= b <= c;那么只需要满足 a+b > c即可;
证明:
任意两边之和大于第三边:
因为 a <= b <= c, 则 a+c > b && b+c > a 是显然的;
任意两边只差小于第三边:
因为: a+b > c 所以: a > c-a && b < c-a;
那么我们只需要证明 b-a < c即可;
因为: b < c 所以 b-a < c-a < c即 b-a < c;
证毕。
此题解法:
有了以上假设解决这道题会非常容易。
这道题有个很朴素的做法就是我们去三重for循环枚举三条边是否满足条件,但是超时也是显然的。
基于知识点二我们可以有如下做法:
1、将给定的n条边进行排序;
2、从大到小去判断相邻的三条边是否有 a[i] < a[i-1]+a[i-2]的关系;
3、如果有就直接跳出循环并输出"YES";否则继续去执行2;
这样我们只需要 (排序+一层循环遍历) 就可以解决了,时间复杂度 O(n*logn);
解法的合理性:
我们来证明一下这样的可行性:
1、对于从大到小遍历的 c 来言,要想找到两个数 a+b > c,肯定a,b越大才越有可能成立。
2、那对于我们排序过后的数组而言,肯定是c往下相邻的两个数是最大的。即就是a[i-1],a[i-2];
3、如果对于当前的 a[i-2]+a[i-2] <= a[i];那么a[i]这条边就可以从我们的遍历数组中去掉了,
因为比a[i]小的最大的两条边都不满足 a+b > c了,那么更小的边更不会满足,因此我们把a[i-1]继续作为
c这条边继续判断。
希望大家能从这道理得到一些思考和启发,此题代码不长,但是需要基础的思维。
代码:
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #define N 100005 5 using namespace std; 6 7 int n, a[N]; 8 int main() 9 { 10 while(scanf("%d", &n) != EOF){ 11 for(int i = 1; i <= n; ++ i) scanf("%d", &a[i]); 12 13 sort(a+1, a+n+1); 14 int ok = 0; 15 for(int i = n; i >= 3; --i){ 16 int x = a[i], y = a[i-1], z = a[i-2]; 17 if(y+z > x){ 18 ok = 1; 19 break; 20 } 21 } 22 printf(ok ? "YES\n" : "NO\n"); 23 } 24 return 0; 25 }
View Code
转载于:https://www.cnblogs.com/NWUACM/p/6388734.html
codeforces - 766B【三角形判断】相关推荐
- 1.4 编程基础之逻辑表达式与条件分支 16 三角形判断
http://noi.openjudge.cn/ch0104/16/ /* 1.4编程基础之逻辑表达式与条件分支 16 三角形判断 http://noi.openjudge.cn/ch0104/16/ ...
- 1.4编程基础之逻辑表达式与条件分支_16三角形判断(9分)
/* 1.4编程基础之逻辑表达式与条件分支_16三角形判断(9分) http://noi.openjudge.cn/ch0104/16/ */ #include <bits/stdc++.h& ...
- 信息学奥赛一本通 1054:三角形判断 | OpenJudge NOI 1.4 16
[题目链接] ybt 1054:三角形判断 OpenJudge NOI 1.4 16:三角形判断 [题目考点] 1. 判断三条边能否构成三角形 这三条边需要满足:任意两边之和大于第三边 2. 逻辑表达 ...
- 信息学奥赛一本通(1054:三角形判断)
1054:三角形判断 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 50647 通过数: 28517 [题目描述] 给定三个正整数,分别表示三条线段的长度 ...
- java三角形判断器_花了两个小时做了那么一个很丑的Java写的三角形判断器.........
闲着无事,花了两三个小时做了那么一个自己都看不下去的Java小程序,可用来判断三角形的类型,输入三边,可以求出各个角的正弦.余弦以及正切值! 说实话,丑得连自己都看不下去了! (不喜勿喷! ) 话不多 ...
- 《课后作业系列》:三角形判断
题目要求 给定三个整数,分别表示三角形三条边的长度 判断这三条边能否构成三角形 如果能构成三角形,则输出:"可以组成三角形!" 如果不能构成三角形,则输出:"无法组成三角 ...
- 【加减乘除类和三角形判断类、一元二次方程】
加减乘除类 public class Calculator {public int add(int a, int b){return a + b;}public int minus(int a, in ...
- 【洛谷题解】B2050 三角形判断
三角形判断 题目描述 给定三个正整数,分别表示三条线段的长度,判断这三条线段能否构成一个三角形. 输入格式 输入共一行,包含三个正整数,分别表示三条线段的长度,数与数之间以一个空格分开.(三条边的长度 ...
- 7-74 三角形判断 (15 分) 给定平面上任意三个点的坐标(x1, y1)、(x2, y2)、(x3, y3),检验它们能否构成三角形。PTA:中M2021春C、Java入门练习第I段
7-74 三角形判断 (15 分) 给定平面上任意三个点的坐标(x1, y1).(x2, y2).(x3, y3),检验它们能否构成三角形. 输入格式: 输入在一行中顺序给出六个[−100 ...
最新文章
- oracle教程之DML事务锁定的机制
- 《搜索引擎-信息检索实践》7.2.1 分类应用与检索/BM25检索模型
- OTSU算法对图像二值化
- 8.4 有监督学习与异常检测-机器学习笔记-斯坦福吴恩达教授
- python逐行读取文件内容的三种方法
- 集合在枚举数实例化后进行了修改_(编程知识)C# 枚举与位枚举
- Flutter Web:Shadow Root问题
- c# UDP(udpclient)客户端和服务端有何区别?
- 团队任务3 每日立会
- Android系列---JSON数据解析
- python画折线图-利用python画折线图
- 【CAD】DWF文件格式详细说明,清晰易懂
- python+selenium小米商城红米K40手机抢购!
- 新百家姓前20位(附前300名)
- 怎样复制秀米html码,秀米微信图文编辑器如何复制?
- 路由汇总与路由聚合的区别
- 在c/c++中调用Java方法
- C#设置按钮鼠标进入时半透明样式
- DirectX11 简介+环境配置
- 2021爱智先行者—红外学习模块(空调遥控器)