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这条边继续判断。
       
希望大家能从这道理得到一些思考和启发,此题代码不长,但是需要基础的思维。

代码:

 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

posted on 2017-02-11 10:24 NWU_ACM 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/NWUACM/p/6388734.html

codeforces - 766B【三角形判断】相关推荐

  1. 1.4 编程基础之逻辑表达式与条件分支 16 三角形判断

    http://noi.openjudge.cn/ch0104/16/ /* 1.4编程基础之逻辑表达式与条件分支 16 三角形判断 http://noi.openjudge.cn/ch0104/16/ ...

  2. 1.4编程基础之逻辑表达式与条件分支_16三角形判断(9分)

    /* 1.4编程基础之逻辑表达式与条件分支_16三角形判断(9分)  http://noi.openjudge.cn/ch0104/16/ */ #include <bits/stdc++.h& ...

  3. 信息学奥赛一本通 1054:三角形判断 | OpenJudge NOI 1.4 16

    [题目链接] ybt 1054:三角形判断 OpenJudge NOI 1.4 16:三角形判断 [题目考点] 1. 判断三条边能否构成三角形 这三条边需要满足:任意两边之和大于第三边 2. 逻辑表达 ...

  4. 信息学奥赛一本通(1054:三角形判断)

    1054:三角形判断 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 50647     通过数: 28517 [题目描述] 给定三个正整数,分别表示三条线段的长度 ...

  5. java三角形判断器_花了两个小时做了那么一个很丑的Java写的三角形判断器.........

    闲着无事,花了两三个小时做了那么一个自己都看不下去的Java小程序,可用来判断三角形的类型,输入三边,可以求出各个角的正弦.余弦以及正切值! 说实话,丑得连自己都看不下去了! (不喜勿喷! ) 话不多 ...

  6. 《课后作业系列》:三角形判断

    题目要求 给定三个整数,分别表示三角形三条边的长度 判断这三条边能否构成三角形 如果能构成三角形,则输出:"可以组成三角形!" 如果不能构成三角形,则输出:"无法组成三角 ...

  7. 【加减乘除类和三角形判断类、一元二次方程】

    加减乘除类 public class Calculator {public int add(int a, int b){return a + b;}public int minus(int a, in ...

  8. 【洛谷题解】B2050 三角形判断

    三角形判断 题目描述 给定三个正整数,分别表示三条线段的长度,判断这三条线段能否构成一个三角形. 输入格式 输入共一行,包含三个正整数,分别表示三条线段的长度,数与数之间以一个空格分开.(三条边的长度 ...

  9. 7-74 三角形判断 (15 分) 给定平面上任意三个点的坐标(x1,​​ y1)、(x2,​​ y2)、(x3,​​ y3),检验它们能否构成三角形。PTA:中M2021春C、Java入门练习第I段

    7-74 三角形判断 (15 分) 给定平面上任意三个点的坐标(x1,​​ y1).(x2,​​ y2).(x3,​​ y3),检验它们能否构成三角形. 输入格式: 输入在一行中顺序给出六个[−100 ...

最新文章

  1. oracle教程之DML事务锁定的机制
  2. 《搜索引擎-信息检索实践》7.2.1 分类应用与检索/BM25检索模型
  3. OTSU算法对图像二值化
  4. 8.4 有监督学习与异常检测-机器学习笔记-斯坦福吴恩达教授
  5. python逐行读取文件内容的三种方法
  6. 集合在枚举数实例化后进行了修改_(编程知识)C# 枚举与位枚举
  7. Flutter Web:Shadow Root问题
  8. c# UDP(udpclient)客户端和服务端有何区别?
  9. 团队任务3 每日立会
  10. Android系列---JSON数据解析
  11. python画折线图-利用python画折线图
  12. 【CAD】DWF文件格式详细说明,清晰易懂
  13. python+selenium小米商城红米K40手机抢购!
  14. 新百家姓前20位(附前300名)
  15. 怎样复制秀米html码,秀米微信图文编辑器如何复制?
  16. 路由汇总与路由聚合的区别
  17. 在c/c++中调用Java方法
  18. C#设置按钮鼠标进入时半透明样式
  19. DirectX11 简介+环境配置
  20. 2021爱智先行者—红外学习模块(空调遥控器)

热门文章

  1. 关于 Python 列表操作,最常见问答Top10
  2. ORACLE 使用函数返回表数据
  3. linux shell 时间运算以及时间差计算方法
  4. NULL 值处理遇到的错误问题.
  5. Android button 居中
  6. Python架构(二)
  7. Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找
  8. 分布式实时计算—Storm—基础介绍
  9. The method getTextContent() is undefined ?
  10. leetcode-生成括号(回溯算法)