前言

大家好,我是bigsai,好久不见甚是想念。

昨晚有个同学参加了阿里的笔试题,笔试完后同学说这次笔试感觉难,跟我说了其中一道题,我看了感觉还是挺有质量的,看着这个难度都是第二题,总共三题感觉还是有难度的(瑟瑟发抖),想着还是和大家分享一下。

描述

一个正m边形,他想知道多边形中等腰锐角三角形的数量。(三角形的顶点要在多边形的顶点上)
不同的三角形的定义:两个三角形,只要有一个点不在同一个位置上就算做不同的三角形。

数据范围3-10^7

分析

昨天看到这个问题,觉得还是比较新颖,也有很多细节,但是刚拿到这个问题自己懵逼的画了好久也才想出来,这里给大家share一下。

瞎折腾

问题的描述很简单,边为n的正多边形有多少等腰锐角三角形。

遇到这种问题我们该怎么分析呢?当然是先画几个案例分析一下。


这么一看,你可能觉得好像没啥规律哇。

你可能对奇数的有点眉目:奇数的每个边直直的就是对应一个点,那么有多少条边就有多少个等腰锐角三角形?

但是这个显然是错误的,有可能以不同的顶点作为等腰锐角三角形它刚好是个等边三角形,这样就会出现重复,然后还有的底边可能并不是恰好是多边形的一个边,而是多边形多个边组成底边(参考上图的正6边型)。

并且从这来看奇数边和偶数边还是有点区别的:放正来看,奇数的是点对边,而偶数的是点对点,结构上有些区别,那么有可能奇偶在结果上是有点区别的。

上面都是一个懵懵懂懂的状态,咱们整理一下有用的信息:

  • 正多边形,多少边就是多少个顶点

  • 正多边形,有轴对称的特性,等腰锐角三角形,也有轴对称的特性。

  • 等腰锐角三角形,腰有两个,而底边有一个,要么从底边考虑,要么从顶点考虑,这里底边如上面的正6边型甚至更多边型显然不容易考虑,但是各个顶点都是多边形的顶点,所以肯定从顶点考虑。算出一个顶点为等腰锐角顶角的所有三角形乘以顶点数量(如正五边形)然后减去重复(如正3、正6边形)的就是总结果了

  • 奇数偶数分开讨论。

偶数情况

我们先用偶数的情况分析,先不考虑重复情况(考虑太多脑子混淆),将 图形摆一下成这样:


因为为正多边形,所以也就相当于各个顶点在圆上,这样更容易分析是不是锐角,这样的分析每个点,就很容易看出每个顶点对应多少个锐角了,正6、正8每个顶点都对应一个锐角,其实有的人可能已经看出规律了,就是在直角下方的线都能组成锐角

为了更清晰的观察,看下面这个图更清晰:


其实就是计算直角下面的蓝色线的数量,这个直观一点是所有横线数量的一半(向下取整),每个横线由两个点组成,我们计算一下:

总共n个点,去掉两个顶点和最底下单个点,n-2个点组成(n-2)/2的线。其中直角下面的占一半就是[(n-2)/2]/2=(n-2)/4个,然后乘以顶点数量n,那么在偶数情况不考虑重复所有等腰锐角三角形数量为:

total=n*((n-2)/4))

奇数情况

回了偶数分析,奇数也很简单,奇数顶点不变,底边固定,也就是找能够组成锐角三角形的边数。


对于横线数量,如果是偶数个没疑问下面是锐角(上面多个顶点所以角度比直角小),而奇数个中间那条线同样也是锐角(如果去掉顶点才在中央),所以这种情况是横线数量的一半(向上取整),我们计算一下:

总计n个点,一个顶点,n-1个点组成线。那么有(n-1)/2个线,其中组成锐角三角形的一半向上取整那就是(n-1)/2+1,然后乘以顶点数量n,那么在奇数情况不考虑重复所有等腰锐角三角形数量为:

total=n*(((n-1)/2+1)/2))

重复三角形

上面考虑了不重复的三角形的情况,那么重复的三角形该怎么考虑了,上面看到正三角形、正6边型都遇到等边三角形而导致重复计算。

而正5、正7好像没有重复的等边三角形。

我们认真分析一下:等腰锐角三角形三个顶点都在正多边形的边上,其实也在一个圆上,如果构成等边三角形,说明这三个顶点能够将空间均分分开(也就是顶点、圆可以均匀分成三份)。那么顶点数量 n必须是三的倍数才可以啊

顶点数量n是3的倍数,那么具体重复了多少呢?

就是看这种等边三角形每个作为顶点,本来应该有n个,但是每种情况出现了三次,所以只考虑其中1/3作为顶点的等边三角形才不重复!所以我们要总次数去掉n的(2/3)。

那么总次数:

total-=(n/3)*2;

具体代码

这里代码有个小坑,n是10^7,那么这个数量级会越界int范围,需要用long,但是输入有的人用int计算这么样代码:

public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();long total;if(n%2==0)total=n*((n-2)/4);elsetotal=n*(((n-1)/2+1)/2);if(n%3==0){total-=(n/3)*2;}System.out.println(total);
}

但是还是错了,有的人还不知道为啥,主要的原因是下面这两句越界了:

total=n*((n-2)/4);
total=n*(((n-1)/2+1)/2);

有人说我已经total设成total设成long为啥还是错的,因为赋值运算符是先计算右侧n*((n-2)/4)此时相当于这么一个流程:

int temp=n*((n-2)/4);
long total=temp;

因为计算的数值范围都是int,所以最后结果也是int已经越界,然后将越界的这个int结果赋值给long范围的total。

和这个很类似的还有:

double a=3/2;System.out.println(a);

会输出1.0而不是1.5,如果想要正确计算那么要提前将计算的值转成double计算:

double a=(double) 3/2;

同样这个问题正确的代码为:

public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();long total;if(n%2==0)total=(long)n*((n-2)/4);elsetotal=(long)n* (((n-1)/2+1)/2);if(n%3==0){total-=(n/3)*2;}System.out.println(total);
}

总结

这种数学题、或者找规律的题还是偶尔可能碰到,多会一题多长个经验!当前还是以积累为主。

大家一起加油,有需要的也欢迎一起打卡力扣。

我是bigsai,肝了一本数据结构与算法pdf和一本动态规划pdf

欢迎添加 「bigsai66」,备注[pdf]领取


原创不易,希望路过彦祖仙女点个赞、再看

热乎着,昨晚阿里这题真太绝了相关推荐

  1. 网易 2019 秋季校园招聘编程题真题集合

    网易 2019 秋季校园招聘编程题真题集合 第一题 俄罗斯方块 问题描述 小易有一个古老的游戏机,上面有着经典的游戏俄罗斯方块.因为它比较古老,所以规则和一般的俄罗斯方块不同. 荧幕上一共有 n 列, ...

  2. 被ddos攻击了怎么办,阿里云高防又太贵了

    近几年来疫情的肆虐,很多企业开始从线下转为线上.因为互联网直播行业,商城行业越来越多.然而随着互联网APP,商城APP数量的增加,出现的问题也大大增多.同行之间的竞争.也随之体现在了网络之间.一些不法 ...

  3. 【计算思维题】少儿编程 蓝桥杯青少组计算思维题真题及解析第2套

    少儿编程 蓝桥杯青少组计算思维题真题及解析第2套 1.天平的左右两端分别放有一些砝码,如下图所示,右边的砝码不变,从左边最多拿走几个砝码,可以使天平左右两边平衡 A.1 B.2 C.3 D.4 答案: ...

  4. 【科技素养题】少儿编程 蓝桥杯青少组科技素养题真题及解析第17套

    [科技素养题]少儿编程 蓝桥杯青少组科技素养题真题及解析第17套 1.在阅读文章和接受信息时注意区分事实和观点十分重要.事实(或称为命题)不同于观点的一个主要特征是 A.可以被证实或证伪 B.是准确无 ...

  5. 【计算思维题】少儿编程 蓝桥杯青少组计算思维题真题及解析第1套

    少儿编程 蓝桥杯青少组计算思维题真题及解析第1套 1.多多观察一个立体图形,从不同的角度看到的形状如下图所示: 这个立体图形可能是  答案:D 考点分析:考查小朋友们的观察能力和推理能力,从前面视角看 ...

  6. 山西专升本C语言编程题真题

    山西专升本C语言编程题真题 2010年 2011年 2012年 2013年 2014年 2015年 2016年 2017年 2018年 2019年 2020年 所有代码为博主本人思路,并非标准答案,仅 ...

  7. 【科技素养题】少儿编程 蓝桥杯青少组科技素养题真题及解析第19套

    少儿编程 蓝桥杯青少组科技素养题真题及解析第19套 1.下列现象中有化学变化发生的是  A.蜡烛融化 B.冰块融化 C.电磁炉烧开水 D.铁生锈 答案:D 考点分析:主要考查小朋友们的物理和化学知识, ...

  8. 计算机科学与技术专业考博课程,北京大学考博计算机科学与技术专业介绍,考博真题,真题解析.pdf...

    北京大学考博计算机科学与技术专业介绍,考博真题,真题解析.pdf [全国百所名校定向保录] [才思教育由命题组领专业化辅导] 考博详解与指导 系所名称 信息科学技术学院 招生总数 118 其中推荐直博 ...

  9. Python计算机二级编程题真题及考点总结(上篇)

    文章目录 一.前言 二.考纲/考试方式 三.编程题详解 3.1 基本操作题-真题 3.2 基本操作题-考点总结 3.2.1 考点一:基本输入输出函数 3.2.2 考点二.三:程序的控制结构和数据类型 ...

最新文章

  1. php怎么实现缓存,PHP怎么实现缓存功能_后端开发
  2. ajax spring mvc 接收json数据,easyui ajax请求获取SpringMVC @ResponseBody返回的Json数据为什么非得eval才能通过对象获取值?...
  3. hdfs路径 linux路径,四、记录1----获取hdfs上FileSystem的方法 记录2:正则匹配路径:linux、hdfs...
  4. mysql 实例启动利用binlog恢复_mysql利用binlog进行数据恢复
  5. 深入jvm虚拟机第三版源码_深入JVM虚拟机,阿里架构师直言,这份文档真的是JVM最深解读...
  6. react-testing-library
  7. ESP8266-Arduino编程实例-BME280环境传感器驱动
  8. am大学计算机科学,美国大学本科计算机科学专业排名一览
  9. Android-原笔迹钢笔手写的探索与开发
  10. 如何用电影摄影来破解大脑
  11. 强智教务系统验证码识别 OpenCV
  12. 2013-2019年百度搜索算法规则解读与应对
  13. C语言程序设计实现调制解调,安徽省二级C语言程序设计笔试样题4.doc
  14. 皕杰报表自定义扩展~自定义数据集
  15. 【GAOPS047】GE口:SGMII模式和serdes模式
  16. 永无止境 Limitless
  17. NOIP2018 模拟测试 day2 神犇大战
  18. python语言通过()来体现语句逻辑关系_【单选题】Python语言通过( )来体现语句之间的逻辑关系。...
  19. 【指针训练——八道题】
  20. 区块链常见漏洞万字总结【Web3从业者必备】

热门文章

  1. EOS 消息设计(3)并行处理之状态评估
  2. (chap6 Http首部) 响应首部字段 Ct-MD5Ct-RangeCt-TypeExpiresLast-Modified
  3. 课堂作业_什么是图灵测试
  4. shell之$@和$*的区别
  5. Git和Github的区别与操作简介
  6. Python编程实现粒子群算法(PSO)详解
  7. python的protected和private
  8. MoeCTF 2021Re部分------time2go
  9. 定义派生类和继承类(从汇编分析)
  10. 【安全漏洞】Resin解析漏洞分析