UVA 11401【数三角形】Triangle Counting------2015年1月24日

1.题意描述

给定边长为1,2,3,····n的n条边,现在要在里面任意选取三条边构成三角形,我们需要求一共可以构成多少个三角形?

2.题目分析

首先我们分析数据大小问题,由于数据最大可以达到10^6。所以我们如果直接枚举时间复杂度可以达到O(n^3),那么我们可以肯定的说这个时间复杂度肯定是不能承受的。

那么我们可以根据前面求整理的排列组合公式的求二项式系数的方法联想到使用递推法。这样时间复杂度可以降低到O(n)。这是可以承受的。要想用递推法,我们肯定需要使用打表的方法,那么空间复杂度肯定是O(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得到最终结果。

最终结果为:

那么最后的递推式我们可以写为:

到这里基本分析完毕。

3.AC代码

#include<iostream>
#include<algorithm>//注意头文件的使用
#include<string.h>
using namespace std;
#define maxn 1000000+5
long long f[maxn];
void process()//函数预处理过程相当于打表这样节省时间
{
    memset(f,0,sizeof(f));
    for(long long  i=4;i<maxn;i++)
        f[i]=f[i-1]+((i-1)*(i-2)/2-(i-1)/2)/2;
}
int main()
{
    long long  n;
    process();
    while(cin>>n&&n)
    {
        if(n<3) break;//这里的坑不要往下跳!!!
      cout<<f[n]<<endl;
    }
    return 0;
}

4.总结

对于数据比较大的题型,特别是可以找到数学规律的题目我们可以采取研究递推公式进而简化时间复杂度,提高效率。

时间: 2024-10-05 05:06:10

UVA 11401【数三角形】Triangle Counting------2015年1月24日的相关文章

高级学员:2015年10月24日作业

高级学员:2015年10月24日作业一.信息安全系统和安全体系1.信息安全系统三维空间示意图中,X.Y.Z轴的名称,及它们各自包括的内容:2.MIS+S.S-MIS.S2-MIS的特点分别有哪些:二.信息安全风险评估1.什么是威胁:2.什么是脆弱性(弱点):3.什么是影响三.安全策略1.安全策略的核心内容是哪七定:2.<计算机信息安全保护等级划分准则>将信息系统分为哪5个安全保护等级,以及它们的适用范围:四.信息安全技术基础1.常见的对称密钥算法有哪些?它们的优缺点:2.常见的非对称密钥算法有

算法竞赛入门经典训练指南【递推问题】------2015年1月24日

1. 常见的数列总结 (1)斐波那契数列: 如何实现斐波那契数列,我们可以采取如下方法: (1)递归求解(慢)(2)递推法 (3)矩阵快速幂 下面给出矩阵快速幂的由来: 除了这些问题,我们对于斐波那契数列还可能涉及高精度数的处理问题. (2)卡特兰数 卡塔兰数是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡塔兰数的一般项公式为                       另类递归式:  h(n)=((4*n-2)/(n+1)

零基础学习云计算及大数据DBA集群架构师【Linux系统环境及权限管理2015年12月24日周四】

1 2015.12.24/Thu 2 3 *************摘要************** 4 ACL主机的细部权限规划 ACL getfacl setfacl 5 attr文件与目录的隐藏属性 attr lsattr chattr 6 文件系统 P196 ext2/3/4 xfs 7 目录树 8 软硬连结 ln 9 指令和文件的搜索 which whereis locate find /var/lib/mlocate/mlocate.db 10 11 ?如何查看软链接文件在磁盘上存放

2015年10月24日作业

一.信息安全系统和安全体系 1.信息安全系统三维空间示意图中,X.Y.Z轴的名称,及它们各自包括的内容: 答:X轴是"安全机制",Y轴是OSI网络参考模型,Z轴是"安全服务":(1)"安全机制"包括第一层:基础设施实体安全,第二层平台安全,第三层数据安全,第四层通信安全,第五层应用安全,第六层运行安全,第七层管理安全,第八层授权和审计安全,第九层安全防范体系:(2)"OSI网络参考模型"包括第一层物理层,第二层链路层,第三层网

高级学员:2015年10月23日作业

高级学员:2015年10月23日作业一.业务流程管理与重组1.流程管理的本质与核心是什么:2.流程管理与BPR的区别:3.业务流程改进的过程和方法中,分析问题用哪2个图:寻找原因用什么图.4.流程的分析与设计方法是哪六条(只答小标题):5.BPR的首要问题是什么:6.BPR的实施会引起企业哪3个方面的变化.二.知识管理1.对于项目组织来说,什么是知识.2.隐性知识的共享方法有哪4条:三.项目整体绩效评估1.什么是3E审计:2.霍尔从哪3个维度考察系统工程.3.用什么分别解决:确定性.可测定的不确

当前时间到固定日期的天数,如:在页面弹出显示到到2015年5月1日还有多少天

2015-03-28 17:46:05 <script> //获取当前系统时间 var now=new Date(); //获取2015年5月1日时间 var date1=new Date('2015/5/1'); //当前日期距初始日期的毫秒数 var s1=now.getTime(); //2015年5月1日距初始日期的毫秒数 var s2=date1.getTime(); //到2015年5月1日还有多少毫秒数 s3=s2-s1; //到2015年5月1日还有多少天 alert('距20

linux运维实战练习-高级班-2015年10月18日-10月24日课程作业(练习)安排

一.作业(练习)内容: 1.阐述Linux HA Cluster的使用背景: 2.总结Linux HA Cluster的系统组成,HA Cluster的工作模型: 3.通过LAMP组合,基于heartbeat v2 crm实现HA:要求,部署wordpress,用于编辑的文章中的任何数据在节点切换后都能正常访问: 二.完成时间: 2015年10月24日之前. 三.提交方式: 请将作业的博文链接地址以评论本博客的形式提交. 格式如: 学员编号+姓名   http://mageedu.blog.51

linux运维实战练习-中级班套餐班-2015年10月18日-10月24日课程作业(练习)安排

一.作业(练习)内容: 1.MariaDB基础总结,包括表管理.索引管理.用户及权限管理: 2.编译安装LAMP,其中分别实现: (1).把php编译成为httpd的模块 (2).php以fpm工作为独立守护进程 3.安装并配置基于虚拟用户的vsftpd: 4.建立nfs共享,将主机172.16.0.1上的目录/magedu通过nfs共享给172.16.0.0/16(可根据自己的网络情况来设置)网络的主机以读写方式使用: 5.建立samba共享,共享目录为/data,要求: 1)共享名为shar

传智播客_2015年Java基础视频-深入浅出精华版 笔记(2015年9月14日23:11:11)

本笔记是个人笔记+摘录笔记相结合,非完全原创 day01 win 7系统打开DOS有趣方法:按住shift+右键,单击“在此处打开命令窗口”(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复?!! 常用DOS命令d: 回车 盘符切换dir(directory):列出当前目录下的文件以及文件夹md (make directory) : 创建目录(创建文件夹)rd (remove directory): 删除目录(删除文件夹,注意:前提是文件夹必须是空的!!)如果

雷米 - 心理罪:暗河(2015年8月9日)

<心理罪:暗河> 作 者:雷米译 者:系 列:出 版:重庆出版社字 数:290千字阅读完成:2015年8月9日