UVa 11401 数三角形-推公式求答案

题目如下:这道题是看书做的,看了人家的想法,就是到了自己的差距不仅仅是做题数,还有智商,与想法。太强。

UVa 11401 数三角形-推公式求答案_第1张图片

这道题的目的给定一个数,让你求从1~n中可以做成多少三角形。

暴力是不行的:这时就要想其他的办法。首先要知道组成三角形的条件,这里就不多说了;

算法题也可已有设未知数来求解。这就很牛了。

证明过程及描述如下:使用加法定理。设最大边长为x的三角形有C(x)个。另外两条边长为z,y;根据三角形的性质可列y+z>x所以x-y

根据不等式,当y=1时显然无解;y=2时只有一个解(z=x-1);y=3时有两个解(z=x-1,z=x-2)知道y=x-1是有x-2个解,所以是个等差数列。但是这还不是正解,有重复。上面包含y=z的情况。而且每个三角形计算了两次。但是这个y=z出现在是么时候就是最重要的点了。根据举例证明当Y从x/2+1到x-1为止有x-1-x/2=(x-1)/2各解:所以:从c(x)=1/2((x-1)(x-2)/2-(x-1))/2;

原题要求的实际上是“最大边长不超过n的三角形数目”f(n).根据加法原理,f(n)=c(1)+c(2)+..+c(n)。可以写成递推公式f(n)=f(n-1)+c[n]。

代码如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;
typedef long long ll;
const ll maxn=1e6+10;
ll f[maxn];
int main()
{
	
	ios::sync_with_stdio(false);
	f[3]=0;
	for(ll x=4;x<=1000000;x++){
		f[x] = f[x-1]+((x-1)*(x-2)/2-(x-1)/2)/2;
	}
	int n;
	while(cin>>n){
		if(n<3)break;
		cout<

 

没啥说的,继续学习。

 

 

你可能感兴趣的:(acm题目)