首页 > 代码库 > 一天一道算法题--6.5--数学题

一天一道算法题--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

 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 */
View Code

好 web实验报告写完 一道题写完 还欠2道