UVA 11401【数三角形】Triangle Counting(数学)

1.题意描述

给定边长为1,2,3,····n的n条边,现在要在里面任意选取三条边构成三角形,我们需要求一共可以构成多少个三角形?

思路:
首先,数据可以到达10的6次方,因此,这里用暴力枚举绝对会tle。
这里要换个思路来考虑。设x,y,z为三角形的三边,x为最长的边,有z+y<x,所以

x-y<z<x,这里考虑y的值来找z对应的解的数量,即为三角形的数量。

令x=x0,当y=1时,z没有解;当y=2时,z有一个解;当y=3时,z有两个解........当y=x0-1时,z有x0-2个解。

所以z的解的数量为等差数列0到x0-2的和,即  (x0-2)(x0-1)/2

但是这里包括y=z的,也有例如y=5,z=3,z=5,y=3这样相反的组合,这些要去掉。

y=z的情况:y=(x0/2)+1到y=x0-1各有一个(可以自己试验下)数量为 (x0-1)-((x0/2)+1)+1=(x0/2)-1

减去y=z的情况后,再除2就能把第二种情况个除去(是对称关系,自己带几个数看下)
最后的数就是x=x0下的三角形的数量。设s[i]为x=i时三角形的数量。
n条边对应的三角形的数量有递推公式f[n]=f[n-1]+s[n]。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
long long f[1000006];
void suan(long long n)
{
memset(f,0,sizeof(f));//初始化
for(long long i=4;i<=n;i++)x=i=3时1 2 3组不成三角形
{
long long c=(((i-1)*(i-2))/2-(i-1)/2)/2;
f[i]=f[i
-1]+c;

}
}
int main()
{
int n;
suan(
1000000);//事先把所有结果都记录再f[]里,打表。
while(scanf("%d",&n)==1)
{
if(n<3){
break;
}
printf("%lld\n",f[n]);//要啥输啥。
}
return 0;
}

心得,数学真的要学好,一下子把o(n^3)的题降到o(n)。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值