UVa 11401 Triangle Counting

原创 2016年06月01日 07:57:30


来源:《算法竞赛训练指南》例题2-2、UVa 11401
题目描述:
求从1…n中选出三个【不同】的数作为三角形合法三条边的方案数。
题目分析:
假设选出来的三个合法的数是p、q、r,则有p + q > r现在要求p < q < r,下面做一点分析。
考虑q = r - 1,则p取值空间为[2, r - 2],一共有r - 3个数。
考虑q = r - 2,则p取之空间为[3, r - 3],一共有r - 5个数。
归纳法或者画画图就知道p的取值方案数是一个等差数列,首项是r - 3,考虑实际意义末项当r为奇数时为0,偶数时为1。记最长边为r(r > 3)时共有g(r)种可行方案,则

g(r)=r/21+(r1)/2
如果不好理解也可以奇偶讨论。实际上注意到c++中整数除法是向零取整(对正数就是向下取整)即可得到公式的正确性。
依次令4…n为最长边,又有
g(1)=g(2)=g(3)=0
记题目所求方案数为f(n);就有
f(n)=i=1ng(i)
于是
f(n)=f(n1)+g(n)

由于我们在计数的时候确保了p < q < r,且 p + q > r 所以不会有重复计数或者不合法计数;由于r是递增的且我们遍历了所有可能的q,所以这样的计数是没有遗漏的。
具体实现时小心递推时 i 是long long型以防溢出。算法耗时主要在对数组的递推,这个时间关于n是线性的。

//  Created by wander on 16/6/1.
//  Copyright © 2016年 W4anD0eR96. All rights reserved.
//  UVa 11401 Triangle Counting
//  类型:组合数学

#include "bits/stdc++.h"
using namespace std;

unsigned long long f[1000050];
int n;

int main() {
#ifdef DEBUG
  freopen("in", "r", stdin);
  freopen("out", "w", stdout);
#endif
  // pre-process
  for (unsigned long long i = 4; i < 1000050; i += 1)
    f[i] = f[i - 1] + ((i >> 1) - 1) * ((i - 1) / 2);
  // input and work
  while (~scanf("%d", &n) && n >= 3)
    printf("%llu\n", f[n]);
  return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

UVA 11401 - Triangle Counting 组合

题目链接点这儿 这题本来

UVA11401(加法原理)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=22646 解题思路: 问1~n内选出三个不同的整数,组成...

例题2.2 数三角形 UVa11401

1.题目描述:点击打开链接 2.解题思路:本题利用代数分析和加法原理解决。根据题目给定的范围,只能使用O(N)级别的算法,直接枚举肯定是会超时的。我们设c(x)表示最大边长为x的三角形的个数。设另外...

BZOJ 1914: [Usaco2010 OPen]Triangle Counting 数三角形

Description 在一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责。从她的守卫塔向下瞭望简直就是一件烦透了的事情。她决定做一些开发智力的小练习,...

[BZOJ1914][Usaco2010 OPen]Triangle Counting 数三角形

计算几何 凹四边形计数

ACdream1008:A Very Easy Triangle Counting Game

Problem Description Speedcell and Shoutmon love triangles very much.One day,they are playing a...

群赛11.10 A Very Easy Triangle Counting Game

Problem G: A Very Easy Triangle Counting Game Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 80  ...

UVA - 11437 - Triangle Fun (计算几何~)

UVA - 11437 Triangle Fun Time Limit: 1000MS Memory Limit: Unknown 64bit IO Format: %lld ...

uva 12165 - Triangle Hazard

#include #include #include using namespace std; typedef struct point { double x,y; point(d...

uva 11437 - Triangle Fun

这是一道简单的计算几何; In the picture below you can see a triangle ABC. Point D, E and F divides the sides ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)