题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=3142
Count triangle
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
一开始就出一大堆英文题确实不好,那么现在来一道中文题目(虽然我觉得英文比中文好解释清楚)。
题目是这样子的:给定N条边,编号从1~N,每条边都有一个边长,问可以组成多少个不同的三角形(有一条边的编号不同便视为不同的三角形)。
请机智的你来解决这道题吧~
输入
输入数据的第一行为一个整数T(T <= 10),表示接下来数据的组数。
每组数据占两行:
第一行为一个正整数N(3 <= N <= 3000)。
第二行按照编号从1~N的顺序依次给出每条边的边长xi(1 <= xi <= 2^30),每个数之间用一个空格隔开。
输出
输出一共T行,每行一个整数,表示可以组成的不同的三角形的个数。
示例输入
2 6 1 2 3 4 5 6 5 5 5 5 5 5
示例输出
7 10
提示
来源
HDU shadow95
示例程序
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- int main()
- {
- int t;
- long long a[3005];
- while(~scanf("%d", &t)) \\这题貌似有毛病,题目明明没有要求的,没这句话白白tle了5遍。。
- {
- while(t--)
- {
- int n;
- scanf("%d", &n);
- for(int i=0;i<n;i++)
- scanf("%lld", &a[i]);
- sort(a,a+n); \\sort 将数组升序排序
- long long sum=0; \\注意此处的整数类型为长整型,n最大为3000,那么结果就为C3 3000
- for(int i=0;i<n-1;i++)
- for(int j=i+1, k=j+1;j<n-1;j++)
- for(;k<n;k++)\\每次的k为上次的最大值,避免了从头遍历
- if(a[k]>=a[i]+a[j])
- {
- sum+=k-j-1;
- break;
- }
- else if(k==n-1)
- {
- sum+=k-j;\\如果到最后的一个值仍然满足a[k]<a[i]+a[j]的话,sum要加上k-j
- break;
- }
- printf("%lld\n", sum);
- }
- }
- return 0;
- }