题目链接:https://odzkskevi.qnssl.com/583fd2a28323fc85d699b873c944c7aa?v=1535670027
题目大意:给出n根小棍,问可以构成多少三角形?
思路:
先定义一个函数f(n):当最大编程为n时所能构成的三角形数目。
对于三角形的三边而言,我们可以设定为x,y,z。并且我们假设x是最大边。那么我们有y+z>x,因此可以推出x-y<z<x。
根据这个不等式我们有,当y=1时,显然无解;当y=2时,有一个解;当y=3时,有两个解;·····当y=x-1时有x-2个解。根据等差数列求和公式我们有一共有
0+1+2+······+(x-2)=(x-1)(x-2)/2。但是我们需要注意,这里包含了y=z情况。那么我们需要减去从y=x/2+1开始到y=x-1为止,此时我们多计数了(x-1)-(x/2+1)+1=(x-1)/2个解,而且除此之外,我们对于每一个y我们都有重复计数,因为前后是对称的。所以我们最后还要除以2得到最终结果。
举个例子:x=6。
x | y | z |
6 | 1 | 0 |
2 | 5 | |
3 | 4,5 | |
4 | 3,4,5 | |
5 | 2,3,4,5 |
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<sstream>
#include<stack>
#include<map>
#define INF 0x3f3f3f
typedef long long ll;
using namespace std;
const int maxn=1000000+10;
ll f[maxn];
int main(){
ll n;
f[1]=f[2]=f[3]=0;
for(ll i=4;i<maxn;i++){
f[i]=f[i-1]+((i-1)*(i-2)/2-(i-1)/2)/2;
}
while(cin>>n){
if(n<3)break;
cout<<f[n]<<endl;
}
return 0;
}
本题要注意一点是:多组输入,当输入n小于3时退出,不然会导致超时。