HDU1249 三角形 递推

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1249


分析:知道了直线和折线分割平面的情况这题就很简单了。我们知道,对于第i个三角形来说,其前面已经有了(i-1)个三角形==>有(3i-3)条边,对于第i个三角形,其每一条边最多能和之前的每个三角形的2条边有交点,即能和前面的(2i-2)条边各有一个交点,而这些交点会把第i个三角形的一条边分割成(2i-1)条线段,每一条线段会增加一个平面,这样3条边就增加了(2i-1)×3个平面,考虑到在三角形的三个顶点,在每一个顶点处相邻的两个线段并不会增加平面的数目,所以在三个顶点处的6个线段实质上只增加了3个平面,所以要减去这3个多算的平面数,这样,第i个三角形就会比i-1个三角形形成的平面数多出(2i-1)×3-3=6×(i-1)个了,即递推关系为:f(n)=f(n-1)+6×(i-1)。



实现代码如下:

 #include <cstdio>
#include <iostream>
using namespace std;
int main()
{
    int f[10001];
    int t,n,i;
    f[1]=2;
    for(i=2;i<=10000;i++)
      f[i]=f[i-1]+6*(i-1);
    cin>>t;
    while(t--)
    {
        scanf("%d",&n);
        printf("%d\n",f[n]);
    }
    return 0;
}




本题也可以用欧拉公式来做:

欧拉公式:简单多面体的顶点数V,棱数E以及面数F之间有:V-E+F=2。


那么对于本题来说,E[i]=E[i-1]+(4i-3)*3;V[i]=V[i-1]+(2i-1)*3;

实现代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define max 10001

int V[max],E[max];
void solve()
{
	int i;
	memset(V,0,sizeof(V));
	memset(E,0,sizeof(E));
	E[1]=V[1]=3;
	for(i=2;i<max;i++)
		E[i]=E[i-1]+(4*i-3)*3;
	
	for(i=2;i<max;i++)
		V[i]=V[i-1]+(2*i-1)*3;		
}
int main()
{
	int T,n;
	solve();
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);	
		printf("%d\n",E[n]-V[n]+2);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值