HDU 1249 三角形(递推)

来源:互联网 发布:java什么是源代码 编辑:程序博客网 时间:2024/05/21 08:43

题目链接:点击打开链接

题目分析:ACM中数学类题目,要么是结论性的,要么就是递推,所以先画几个图形看看

                 n=1   ---------->  face =2;

                 n=2  -----------> face  =8;

                 n=3  -----------> face  =20;

每条边最多与前面已画的(n—1)个三角形的各两条边相交,第n个三角形每条边最多与2*(n-1)条边相交。对于每条边,它所截出的区域(不算第n个三角形的角)有2*(n-1)-1个,于是3条边可截出6*(n-1)-3个区域,再加上f [n] 已经截出的面,加上新增三角形一定会增加的3个角(face),

                f[n]=f[n-1]+3+6*n-9=f[n-1]+6*(n-1);

                所以

另外附上一位仁兄的证明

 

 

#include<algorithm>#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<cmath>using namespace std;__int64 f[10005];void init(){    f[1]=2;    for(int i=2;i<=10000;i++)    f[i]=f[i-1]+6*(i-1);}int main(){    int t,n;    init();    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        printf("%I64d\n",f[n]);    }    return 0;}


 

 

 

0 0
原创粉丝点击