码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 11401 - Triangle Countin

时间:2014-11-12 16:35:21      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:blog   io   os   使用   sp   for   数据   on   2014   

题目:给你n根长度分别为1,2,..,n的棍子,问能组成多少个不同的三角形。

分析:组合数学,计数原理。本题可以正向求解也可以反向求补集,这里采用正向求解。

            1.首先写出前几组数据,找规律:{ 里面的括号是子情况 }

            (4,3,(2))

            (5,4,(3,2))

            (6,5,(4,3,2))(6,4,(3))

            (7,6,(5,4,3,2))(7,5,(4,3))

            (8,7,(6,5,4,3,2))(8,6,(5,4,3))(8,5,(4))

             对于上述的数据采用记号[a,b,c,...] 记录对应每种的子情况数,则转化如下:

             [1]

             [2]

             [3,1]

             [4,2]

             [5,3,1]

            观察发现,每组中对应的子情况数依次递增1,每当最后的一组变为3时,后面就出现新的组;

            这是因为n的奇偶性不同产生的影响,当最长的边为l时,对应存在的解应该如下:

            (l,l-1,(2))(l,l-2,(3,2)),... ,(l,l-k,(k,..,2))

            无论l的奇偶性,k均取值l/2(这里是整除),因此解的个数与奇偶性相关的;

           2.然后观察计算

           解的个数为:n-3 + n-5 + .. + r;{ n为奇数r为2,n为偶数r为1 }

           分就两种情况求通向公式有:

           f(n)=(n^2 + 4n +4)/ 4 { n为偶数 };f(n)= (n^2 + 4n +3)/ 4 { n为奇数 };

           因为写成程序时是整除运算,所以这里都是用偶数的通项公式没有影响;

           因此有:f(n)= (n^2 + 4n +4)/ 4,为最长边为n时的解的个数,求和输出即可。

说明:注意使用long long类型。

#include <iostream>
#include <cstdlib>

using namespace std; 

long long F[1000001];
long long S[1000001];

int main()
{
	long long temp;
	for (int i = 4 ; i < 1000001 ; ++ i) {
		F[i] = (1LL*i*i-i*4LL+4LL)/4LL;
		S[i] = 0LL+F[i]+S[i-1];
	}
	int n;
	while (cin >> n && n >= 3)
		cout << S[n] << endl;
	
	return 0;
}


UVa 11401 - Triangle Countin

标签:blog   io   os   使用   sp   for   数据   on   2014   

原文地址:http://blog.csdn.net/mobius_strip/article/details/41044307

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!