ACdream 1067:Triangles
来源:互联网 发布:保险大数据分析框架 编辑:程序博客网 时间:2024/05/22 15:18
Problem Description
已知一个圆的圆周被N个点分成了N段等长圆弧,求任意取三个点,组成锐角三角形的个数。
Input
多组数据,每组数据一个N(N <= 1000000)
Output
对于每组数据,输出不同锐角三角形的个数。
Sample Input
345
Sample Output
105
分析:当3个点组成锐角三角形ABC时,圆心O一定在三角形内部,∠AOB , ∠BOC, ∠COA一定小于180度(∠AOB + ∠BOC + ∠COA = 360度)(1)当N为偶数时,用1, 2 .... k , k+1, .... , 2k来标记N个点(2K = N). 固定一个点, 如点A = 点k, 那么2k点是肯定不能选的了,因为 k, 2k组成一条直径。 所以剩下两个区间 [1, k-1], [K+1, 2k-1].如果点B, 点C同处一个区间,那么ABC一定是一个钝角三角形,所以B,C一定不可处于同一区间。 设点B = 点x, x 属于[1, k-2]; 点C=点y,y 属于[k+1, 2k-1]; 在这样的情况下,y - x > k 才能使得ABC为锐角三角形 ==> (x, y)的取值有S = 0 + 1 + 2 + ... + (k - 2) = (k -1) * (k -2) /2 = (N/2 - 1) * (N / 2 - 2) / 2 ; 有N个点,每个三角形被重复计算3次,所以一共有 S * N / 3种;(2)点N为奇数时, k = N / 2. 用0, 1 ... k , k + 1, 2k. 固定点A = 点0,则过点A的直径把N个点分成[1, k], [k+1, 2k]两个部分。和(1)同理,可以令 点B = 点x , x 属于[1, k], 点C = 点y, y 属于[k+1, 2k]; 在这样的情况下,y - x <= k 才能使得ABC为锐角三角形 ==> (x, y)的取值有S = k + (k- 1) + ... + 1 = k * (k +1) /2 = (N/2) * (N / 2 + 1) / 2 ; 有N个点,每个三角形被重复计算3次,所以一共有 S * N / 3种;综上:N 为偶数时, ans = N * (N/2 - 1) * (N / 2 - 2) / 6;N为奇数时, ans = N * (N/2) * (N / 2 + 1) / 6;
0 0
- ACdream 1067:Triangles
- acdream 1067 Triangles (结论)
- ACDream 1067 Triangles
- ACdream 1067:Triangles
- ACdream Triangles
- ACDream 1024:Triangles
- Triangles
- Triangles
- Triangles
- Triangles
- Triangles
- Triangles
- ACDream 1067 Convex
- ACdream
- Acdream
- ACdream
- ACdream
- ACdream
- 做游戏,学编程(C语言) 1 实现弹跳小球
- CentOS 安装NodeJS
- hadoop重新编译---安装系列二
- 火力发电厂工控系统网络安全解决方案
- HDOJ 2005 第几天?
- ACdream 1067:Triangles
- 做游戏,学编程(C语言) 2 最简单的飞机游戏
- task_struct解析
- 读计算机必看:美国顶尖IT公司从哪些大学招人最多?
- Redis Sentinel 说明
- 多线程同步问题-练习题1-笔记整理
- 禅道的使用
- A+B Problem IV
- HDU-5858 Hard problem(计算几何)