UVa 11401 - Triangle Countin

题目:给你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;
}
时间: 2024-10-11 12:19:07

UVa 11401 - Triangle Countin的相关文章

UVA 11401 - Triangle Counting(数论+计数问题)

题目链接:11401 - Triangle Counting 题意:有1,2,3....n的边,求最多能组成的三角形个数. 思路:利用三角形不等式,设最大边为x,那么y + z > x 得 x - y < z < x 然后y取取值,可以从1取到x - 1,y为n时候,有n - 1个解,那么总和为0 + 1 + 2 +...+ (x - 2) = (x - 1) * ( x- 2) / 2; 然后扣除掉重复的y = z的情况,在y > x / 2时,每个y取值会出现一次y = z.

UVA - 11401 - Triangle Counting (递推!)

UVA - 11401 Triangle Counting Time Limit: 1000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem G Triangle Counting Input: Standard Input Output: Standard Output You are given n rods of length 1, 2-, n. You have

uva 11401 - Triangle Counting(数论)

题目链接:uva 11401 - Triangle Counting 题目大意:有多少种方法可以从1,2,3...n中选出3个不同的数组成三角形,给出n,求种数. 解题思路:加法原理,设最大边为x的三角形有c(x)个,那么另外两条边长分别为y和z,根据三角形的形式可以的y+z>x,所以z的范围即为x?y<z<x 根据这个不等式可以得到每个y值所对应的z值个数,为等差数列,所以 c(x)=(x?1)?(x?2)2??x?12?2 然后根据递推:f(n)=∑i=1nc(i) 代码 #incl

UVA 11401 - Triangle CountingTriangle Counting 数学

You are given n rods of length 1,2, . . . , n. You have to pick any 3 of them and build a triangle. Howmany distinct triangles can you make? Note that, two triangles will be considered di?erent if they haveat least 1 pair of arms with di?erent length

UVa 11401 Triangle Counting (计数DP)

题意:给定一个数 n,从1-n这些数中任意挑出3个数,能组成三角形的数目. 析:dp[i] 表示从1-i 个中任意挑出3个数,能组成三角形的数目. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <

【递推】【组合计数】UVA - 11401 - Triangle Counting

http://blog.csdn.net/highacm/article/details/8629173 题目大意:计算从1,2,3,...,n中选出3个不同的整数,使得以它们为边长可以构成三角形的个数. 思路:用一般的方法需要三重循环,时间复杂度为O(n^3),肯定超时,因此可用数学的方法对问题进行分析.设最大边长为x的三角形有c(x)个,另外两边长分别为y,z,则可得x-y<z<x:固定x枚举y,计算个数0+1+2+...+(x-2)=(x-1)(x-2)/2.上面的解包含了y=z的情况,

UVA 11401 Triangle Counting

[题意分析] 本题就是在给定的N条边(边长是1,2,3,,,N)里面找合乎要求的三角形个数(任意两条边之和大于第三边).如果我们直接枚举合乎题意的三角形那么我们不太好出发(想想为什么?),那么我们可以采用补集观念,先找出不合乎要求的三角形数目,再用总的组合数减去不合乎要求的数目,就得最后的结果.那么问题是我们如何枚举不合乎要求的三角形数目呢?我们设三角形的三条边是a,b,c.我们不妨用c表示任意三条边中的边长最大值,那么我们可以得到一个简单的结论:如果能够构成三角形c<a+b.那么当用a和b作为

UVA - 11437 - Triangle Fun (计算几何~)

UVA - 11437 Triangle Fun Time Limit: 1000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem A Triangle Fun Input: Standard Input Output: Standard Output In the picture below you can see a triangle ABC. Point D, E

uva 194 - Triangle(几何)

题目链接:uva 194 - Triangle 注意两边一角,并接角的对边确定时(即用正弦定理求解时,可能会有多解的情况) #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const double pi = 4 * atan(1); const double eps = 1e-4; double A[6]; void