原始题目
题目大意
有长度分别为\(1,2,3,4 \cdots n\) 的木杆各一根,问共可以组成多少个三角形。
解题思路
- 设\(f[x]\) 表示以\(x\)为最长边的三角形的个数。
- 设另两条边为\(y,z\),易知\(y+z>x\),所以\(x-z<y<x\),当\(z>=2\)时有解。
- 解的情况总数为\(\sum {i=2}^{x-1} { \frac {(x-2)(x-1)}{2}}\)。但里面包括 y,z 互换以及 y=z 的情况
故还需要减去等腰三角形数再除以 2
解题代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <iomanip> #include <set> #include <queue> #include <map> #include <stack> #include <algorithm> #include <vector> #include <string> #include <sstream> #define rep(i,a,n) for(int i=a;i<n;++i) #define per(i,a,n) for(int i=n-a;i>=a;--i) #define se second #define fi first #define eps 1e-8 #define INF 0x3f3f3f3f using namespace std; const int maxn=1e6+5; const int maxl=26; const int maxm=1e6+5; typedef long long ll; typedef unsigned long long ull; typedef vector<int> vi; typedef pair<int,int> pii; ll n,m; ll f[maxn],sum[maxn]; void solve(){ f[0]=f[1]=f[2]=0; for(ll i=3;i<=maxn-1;i++){ f[i]=(i-2)*(i-1)/2; f[i]=(f[i]-(i-i/2-1))/2; sum[i]=sum[i-1]+f[i]; } } int main(){ ios::sync_with_stdio(false); solve(); while(cin>>n&&n>=3){ cout<<sum[n]<<endl; } }
|
收获与反思