SDUT 3142 Count triangle

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

示例程序

 
这题想了半天果然不会,然后看了会别人的代码,思想挺简单的,直接上代码了,应该挺好理解的

  1. #include <cstdio>  
  2. #include <cstring>  
  3. #include <algorithm>  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     int t;  
  8.     long long a[3005];  
  9.     while(~scanf("%d", &t))  \\这题貌似有毛病,题目明明没有要求的,没这句话白白tle了5遍。。
  10.     {  
  11.         while(t--)  
  12.         {  
  13.             int n;  
  14.             scanf("%d", &n);  
  15.             for(int i=0;i<n;i++)  
  16.                 scanf("%lld", &a[i]);  
  17.             sort(a,a+n);  \\sort 将数组升序排序
  18.             long long sum=0;  \\注意此处的整数类型为长整型,n最大为3000,那么结果就为C3 3000
  19.             for(int i=0;i<n-1;i++)  
  20.                 for(int j=i+1, k=j+1;j<n-1;j++)  
  21.                     for(;k<n;k++)\\每次的k为上次的最大值,避免了从头遍历
  22.                         if(a[k]>=a[i]+a[j])  
  23.                         {  
  24.                            sum+=k-j-1;
  25.                            break;  
  26.                         }  
  27.                         else if(k==n-1)  
  28.                         {  
  29.                             sum+=k-j;\\如果到最后的一个值仍然满足a[k]<a[i]+a[j]的话,sum要加上k-j
  30.                             break;  
  31.                         }  
  32.             printf("%lld\n", sum);  
  33.         }  
  34.     }  
  35.     return 0;  
  36. }  
  37.    
  38.   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值