数三角形Triangel Counting UVa 11401()

来源:互联网 发布:定制t恤 淘宝 编辑:程序博客网 时间:2024/06/08 07:26

题意

给定一个整数n,有多少种方法可以从1、2、3、、、n中选择元素构成三角形?

分析

我们设三角形的三边长度分别为x, y, z,若我们假设x是最长边,,因为我们规定了x是最长边,所以根据加法原理,这些三角形和其他x构成的三角形一定是不一样的,我们设以x为最长边构成三角形的数量为c(x)。
根据三角形的性质我们不难得出x - y < z < x,当y = 1时 z有0个解,当y = 2 时 z有1个解 。。。当y等于x - 1时 z 有 x - 2 个解,总共数量是:(x2)(x1)2但是这些解中还存在一些重复的情况和不合法的情况(y == z),最后我们推导出我们的结果为:12((x1)(x2)2(x1floor(x2)))

c++#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;const int maxn = 1000000 + 10;long long f[maxn], n;void init(){    memset(f, 0, sizeof(f));    for(long long  i = 3; i < maxn; i++){        f[i] = f[i - 1] + ((i - 1) * (i - 2) / 2 - (i - 1 - i / 2)) / 2;    }}int main(int argc, const char * argv[]) {    init();    while(scanf("%lld", &n) != EOF){        if(n < 3) break;        printf("%lld\n", f[n]);    }    return 0;}

小结

问题还是要一步一步从例子开始研究,重要的不是最后能不能搞的出来,而是在不断的研究过程中对问题本身认识的加深和研究问题能力的提高