您的位置:首页 > 其它

一天一道算法题--6.5--数学题

2014-06-06 15:54 162 查看
感谢 微信平台: 一天一道算法题 ---每天多一点进步----

话说 这题 我百度了一下 没找到哪个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

/*
设三角形三条边长分别为X Y Z 最大边长为X的三角形有cnt(x)个 那么下面这个不等式就是成立的 y+z>x 所以可以推出y 或 z的取值范围
我这边 就求z的范围了     x-y < z < x
然后 就是很关键的一步了 你这里能想到就OK了
对于z来说 当y=1的时候 是无解的:因为z<x 那么z+1<=x
当y=2的时候 有一个解:因为x至少比z大 一  那么z+2 就可以大于z
当y=3 4 ..x-1 = x-2 个解 :同理 并且 因为 我描述不来。。
但这不是cnt(x)的正解 因为上面的情况包括了 y == z的情况 并且每个三角形遍历了两次( 就是重复计算了 以x/2为界 重复计算了 因为
三角形的时候 y=3 z=4  与y=4 z=3是一样的) 至于 y==z 的情况 就是出现在 x/2+1 -- x-1
那么 共 x-1-x/2-1+1 = (x-1)/2个 ( 因为 题目要求 边长 都不相等 所以就不能有 y=z=3 这种情况出现 )

最后 我们就得到了 式子 cnt(x) = ( (x-1)*(x-2)/2 - (x-1)/2 )/2 ;
*/


View Code
好 web实验报告写完 一道题写完 还欠2道
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: