首页 > 其他 > 详细

UVa11401

时间:2016-08-24 06:33:21      阅读:278      评论:0      收藏:0      [点我收藏+]

题意:从1~n中选出3个整数,使得他们三边能组成三角形,给定一个n,问能组成多少个不同的三角形?

 

分析:n最大能达到1000000,所以只能用O(n)来解决。

 

设最大边为x的三角形个数为C(x),y+z>x , x-y<z<x,当y=1时 z无解,y=2,z一个解……y=x-1,z有x-2个解

 

所以0+1+2+……+x-2=(x-1)(x-2)/2,但是里面有y=z的情况。

我们将y=z的情况数单独计算,y的取值总x/2 + 1到x-1,共x-1-x/2=(x-1)/2种情况

 

而且里面每个三角形重复了2遍,所以c(x)=((x-1)*(x-2)/2-(x-1)/2)/2,

 由于f[x]表示最长边不超过x的情况数

f[x]=f[x-1]+((x-1)*(x-2)/2-(x - 1)/2)/2。

技术分享
 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 typedef long long LL;
 5 const int N = 1100001;
 6 LL f[N];
 7 int main(){
 8     f[3] = 0;
 9     for(LL x = 4 ; x <= 1000000 ; x++)//这个地方要注意x要为longlong
10     f[x] = f[x - 1] + ((x - 1) * (x - 2) / 2 - (x - 1) / 2) / 2;
11     int n;
12     while(scanf("%d",&n) && n >= 3)
13         printf("%lld\n",f[n]);
14     return 0;
15 }
View Code

 

UVa11401

原文:http://www.cnblogs.com/cyb123456/p/5801383.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!