一天一道算法题--6.5--数学题
感谢 微信平台: 一天一道算法题 ---每天多一点进步----
话说 这题 我百度了一下 没找到哪个OJ 有出这题
下次 来给我们的学弟学妹们把....
那我来说下题目大意:
给你一个n 问你从1,2,3……n中选出3个数 能够构成多少种不同的三角形 比如N=5 可以有(2,3,4)(2,3,5)(3,4,5)三种
输入:(3<=n<=n1000000)
输出:种类数
首先 既然是做acm 那么 一般暴力 都直接放弃吧 这里也需要O(n^3) GG
这里 微信提供的分析 很好 我相信 你慢慢理解 下肯定能看懂 那我就先将它藏起来 =你卡住的时候 see it
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 设三角形三条边长分别为X Y Z 最大边长为X的三角形有cnt(x)个 那么下面这个不等式就是成立的 y+z>x 所以可以推出y 或 z的取值范围 3 我这边 就求z的范围了 x-y < z < x 4 然后 就是很关键的一步了 你这里能想到就OK了 5 对于z来说 当y=1的时候 是无解的:因为z<x 那么z+1<=x 6 当y=2的时候 有一个解:因为x至少比z大 一 那么z+2 就可以大于z 7 当y=3 4 ..x-1 = x-2 个解 :同理 并且 因为 我描述不来。。 8 但这不是cnt(x)的正解 因为上面的情况包括了 y == z的情况 并且每个三角形遍历了两次( 就是重复计算了 以x/2为界 重复计算了 因为 9 三角形的时候 y=3 z=4 与y=4 z=3是一样的) 至于 y==z 的情况 就是出现在 x/2+1 -- x-1 10 那么 共 x-1-x/2-1+1 = (x-1)/2个 ( 因为 题目要求 边长 都不相等 所以就不能有 y=z=3 这种情况出现 ) 11 12 最后 我们就得到了 式子 cnt(x) = ( (x-1)*(x-2)/2 - (x-1)/2 )/2 ; 13 */
好 web实验报告写完 一道题写完 还欠2道
just follow your heart