UVA onlinejudge 11401 - Triangle Counting

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2396

题目大意:(这题不好复制过来,就简单说一下题意)输入整数n,从1-n数字中取能构成三角形的三个数,问能得到多少个不同的三角形(不同是指至少有一条边不等)。

Input

5
8
0

SamplOutput
3
2


解题思路:观察规律,递推,实现O(n)复杂度。n为3时这样的三角形有0个,n为4时,以4为一条边的三角形有1个即2,3,4,所以一共有1+0=1个,n为5时,以5为一条边的三角形有2个,即5,4,3,和5,4,2。所以一共2+1=3个......(递推到即可)。n从3开始以n为一条边的三角形分别有0,1,2,4,6,9,12,16,20,25,30......个,观察就能找到规律。


代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
const ll maxn=1000005;
ll b[maxn],a[maxn];//a[]是以i为边的能得到几个三角形,b[]是i个数能得到几个三角形
int main()
{
	ll n;
	memset(b,0,sizeof(b));
	memset(a,0,sizeof(a));
		a[3]=0;
	ll cur=1,ans=0;
	for(ll i=4;i<maxn;i++)
	{
		a[i]=a[i-1]+cur;
		if(i%2)
			cur++;
		ans+=a[i];
		b[i]+=ans;
	}
	while(cin>>n)
	{
		if(n<3)
			break;
		cout<<b[n]<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值