题目链接: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;
}