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.   

内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
### SDUT PTA 编程题解与在线评测系统使用说明 #### 关于SDUT PTA在线评测系统的概述 SDUT PTA(Programming Teaching Assistant)是一个面向学生学习编程的在线评测平台,主要用于支持山东理工大学计算机科学及相关专业的课程教学。该平台提供了丰富的练习题目以及自动化的测试机制,帮助学生巩固所学的知识并提升实际编程能力[^1]。 #### 如何使用SDUT PTA在线评测系统? 以下是关于如何有效利用SDUT PTA进行编程训练的关键要点: 1. **注册账号** 学生需通过学校指定的方式完成账户注册,并登录到对应的班级页面参与作业提交和考试活动。 2. **熟悉界面布局** 登录后可以看到左侧导航栏包含了“我的作业”、“公开试题”等功能模块;右侧则显示具体任务列表及其状态信息(未做/已交/得分情况)。点击某道题目可以查看其详细描述、样例输入输出以及其他提示内容[^2]。 3. **编写代码并调试** 对于像“计算1到n的和”的简单题,可以直接采用如下C语言实现方式来解决: ```c #include<stdio.h> int main(){ int n, sum=0; scanf("%d",&n); for(int i=1;i<=n;i++) { sum +=i; } printf("%d\n",sum); return 0; } ``` 此段代码实现了基本的功能需求——读取用户输入的一个正整数值`n`,并通过循环累加得到最终的结果输出。 4. **提交解决方案** 完成本地开发环境中的编码工作之后,在网页端找到对应位置上传源文件或者直接粘贴文本框内的代码片段即可发起评测请求。注意遵循每道题目的特殊约束件比如时间复杂度限制等规定。 5. **分析反馈结果** 提交完成后会迅速获得运行状况报告,如果存在错误,则应仔细阅读报错消息重新审视自己的逻辑是否存在漏洞再尝试修正直至完全正确为止。 #### 常见题解答 对于初学者来说可能会遇到一些困惑之处,下面列举几个典型场景供参考: - 如果发现即使按照标准答案复制也得不到满分怎么办?可能是因为忽略了某些界情形处理或者是格式化方面的小失误所致。 - 当面对较复杂的算法类挑战不知道从哪里下手时建议先梳理清楚思路画流程图辅助理解后再动手实践。 - 还有就是保持耐心多试几次不要轻易放弃因为每一次失败都是成长的机会! ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值