数学:给你长度1~n的线段 组成三角形最长边长度不超过你的n三角形有多少个

Triangle Counting

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述
You are given n rods of length 1, 2…, n. You have to pick any 3 of them and build a triangle. How many distinct triangles can you make? Note that, two triangles will be considered different if they have at least 1 pair of
arms with different length.

输入
The input for each case will have only a single positive integer n(1<=n<=1000000). The end of input will be indicated by a case with n<1. This case should not be processed.
输出
For each test case, print the number of distinct triangles you can make.
样例输入
5
8
0
样例输出
3
22
来源
UVA
上传者

TC_李远航

思路:

常规思路是模拟

但是时间复杂度将会是(o^3)明显超时

所以我们猜一定是有规律的,从数学角度开始分析

设三角形最长边为x,(其他y,z) 最多有c(x)个三角形

那么y+z>x

x-y<z<x

所以当y=1是误解0 y=2 一个解 y=3 三个解.....

0+1+2+3+....+(x-2)

总共:(x-2)*(x-1)/2

但是这里计算了y=z的情况而且每个三角形算了两次

(y=z的情况) y=x/2+1开始 (x-1)-(x/2+1)+1=x/2-1 不难发现x为奇数情况是x/2 偶数情况是x/2-1 so→(技巧)(x-1)/2避免奇偶讨论

于是 c(x)=((x-1)(x-2)/2-(x-1)/2)/2

题目问题的是最长边长不超过n的三角形有多少个 so F(n)=F(n-1)+c(n);

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
long long a[1000005];
int main()
{
    int n;
    a[1]=a[2]=a[3]=0;
    for(long long i=4;i<1000005;i++)
        a[i]=a[i-1]+((i-1)*(i-2)/2-(i-1)/2)/2;
    while(~scanf("%d",&n))
    {
        if(n<=0)
            break;
        printf("%lld\n",a[n]);
    }
}
时间: 2024-11-26 02:00:58

数学:给你长度1~n的线段 组成三角形最长边长度不超过你的n三角形有多少个的相关文章

一条直线上N个线段所覆盖的总长度

原文:http://blog.csdn.net/bxyill/article/details/8962832 问题描述: 现有一直线,从原点到无穷大. 这条直线上有N个线段.线段可能相交. 问,N个线段总共覆盖了多长?(重复覆盖的地区只计算一次) ================================================ 解题思路: 可以将每个线段拆分成“单位1” 遍历所有线段,使用一个数组记录每个线段所走过的“单位1” 最后统计数组中被走过的中“单位1”的个数,即是所有线

Inheritance - SGU 129(线段与多边形相交的长度)

题目大意:给一个凸多边形(点不是按顺序给的),然后计算给出的线段在这个凸多边形里面的长度,如果在边界不计算. 分析:WA2..WA3...WA4..WA11...WA的无话可说,总之细节一定考虑清楚,重合的时候一定是0 代码如下: ========================================================================================================= #include<stdio.h> #include&

!HDU 4380 三角屋内有奇数个宝藏的三角形有多少个-计算几何-(向量叉乘&amp;线段与点的关系&amp;暴力枚举)

题意:小明要买三座房子,这三个房子构成一个三角形,已知n个房子的坐标,任何三个房子都不在一条直线上,又已知有m个宝藏的坐标,问房子构成的三角形内有奇数个宝藏的三角形有多少个.数据范围:n(3~100),m(1~1000) 分析: 简单的计算几何.记住这题的做法. 三角形内的点的个数=上面的线段下面的点的个数 -- 下面两条线段下面的点的个数(或者下面一条线段减上面两条线段,看具体位置情况,所以直接取绝对值就好) n个点有n(n-1)/2条线段,不超过1W,枚举每条线段,再枚举每个宝藏的坐标(10

Uva 12012 Detection of Extraterrestrial 求循环节个数为1-n的最长子串长度 KMP

题目链接:点击打开链接 题意: 给定一个字符串str 求字符串str的 循环节个数为 1-len 个的 最长子串长度 思路:套用kmp的性质 #include<string.h> #include<stdio.h> #include <iostream> using namespace std; #define n 1300 void getnext(char str[n],int next[n]){ int m=strlen(str); next[0]=next[1]

HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。

什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request-response protocol(请求-回复协议)工作. GET - 从指定的服务器中获取数据 POST - 提交数据给指定的服务器处理 GET方法: 使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器: /test/demo_form.jsp?name1=value1

设计表的时候,对变长字段长度选择的一点思考

不管是在MSSQL还是MySQL或者Oracle,变长字段的长度衡量都是要经常面对的.对于一个变长的字段,在满足业务的情况下(其实所谓的满足业务是一个比较模糊的东西),到底是选择varchar(50)还是varchar(200)亦或是varchar(500)?对于保守型选择,往往是选择一个较大的长度,比如varchar(500)要比varchar(50)更具有兼容性,因为是变长字段的原因,存储空间也一样.这样的选择并不能说就不好,看站在哪个角度来看问题.那么,相对于varchar(50),var

Tunnel Warfare HDU - 1540(线段树最长连续区间)

题意: 一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 解析: 线段树结点 设置一个  lq记录区间左端点开始的最大连续个数,  rq 记录区间右端点开始的最大的连续个数 其它和原来一样即可 看代码吧... #include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <queue>

R对象及其模式和属性&lt;查看对象模式,长度,创建空对象,增减向量的长度&gt;(3)

R对象的内在属性 模式 x <- c(1,2,3) ; y<-c("1","2","3") mode(x)  "numeric" mode(y)  "character" x_char <- as.character(x);     将x强转为字符类型    类似于java中的(int) , Integer.toString() y_num <- as.numeric(y);    

Leetcode3---&gt;无重复字符的最长子串长度

题目:给定一个字符串string,找出string中无重复字符的最长子串. 举例: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with the length of 1. Given "pwwkew", the answer is "wke"