UVA&&NYoj Triangle Counting

来源:互联网 发布:域名和网址的区别 编辑:程序博客网 时间:2024/06/06 01:40

题目链接:点击打开链接

题目的意思很是容易,就是,给你长度为1,2,3,4,5,6.....n的木棍,选取其中的任意三根木棍,看最多能组成几个不相同的三角形。

思路:

设f(x)为以x为最长边的三角形,最多有f(x)个不同的三角形。

在设另外的两条边为y,z。那么z的取值范围就是(x-y,x)。

当y=1,z的取值为0个。

当y=2,z的取值为1个。

...

当y=x-1,z的取值为x-2个。

比如x=7的时候,符合是三条边为:

y=2:267

y=3:357 367

y=4:447 457 467

y=5:537 547 557 567

y=6:627 637647 657 667

y=7不符合。

我们可以看到,只要把y=z的去掉,剩下里面的有一对一对相对应的,所以/2就是f(x)的answer。

这样的话,我们可以,得到。

一个递推式:answer(x)=answer(x-1)+f(x)。

代码:

 #include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;#define LL long longconst LL N=1000003;LL ans[N];int main(){    ans[1]=0;ans[2]=0;ans[3]=0;    for(LL i=4;i<=N-3;i++)    ans[i]=ans[i-1]+((i-1)*(i-2)/2-(i-1)/2)/2;    LL n;    while(scanf("%lld",&n)&&n>=1){        printf("%lld\n",ans[n]);    }    return 0;}        

在概率论课上,我们学过,如果一个事件的概率不是很好求解的话,那么,如过其对立事件比较容易求解的话,我们可以求他的对立事件。然后求解需要求解的问题的解。

这不仅仅在概率上是可行的,在许多问题上都是可以这样求解的。

那么我们用求其钱堆里事件来分析一下,这个问题:

分析:(转载)
如果单纯统计合法的三角形,好像不大好办。但如果去统计不合法的,还算好办一些,因为不合法的三角形就相当于找到任意两条边a、b,并且另外一条边c要满足c>=a+b,那么以a、b为边的不合法的三角形一共就有N-(a+b)+1种(这里假设a+b<=N),当然我们不能直接枚举a、b去计算。但观察到实际上a+b的范围是有限的,3到2*N-1而已,那么不妨考虑如果和为i的时候一共有多少对不同的a、b呢?比较容易发现是有(i-1)/2对的,那么最后不合法的三角形数量就变成了sum{(i-1)/2*(N-i+1)}(3<=i<=N)。但是由于数据的原因,O(N)的办法是过不了的,不过我们能够将上面的表达式化简成能O(1)计算的形式。


0 0
原创粉丝点击