uva 11401 - Triangle Counting

简介: 点击打开链接 题意:给定一个n表示有n个1~n的数,现在要从这里面选出3个不同的整数问可以组成三角形的个数 思路: 1 n的上限是10^6,O(n^2)以上的时间复杂度都无法满足要求 2 设最大的变长为x,另外两边的为y和z并且x y 和z是不同的,那么有y+z > x,因此就有x-y < z < x    根据这个不等式我们知道,y = 1时无解,y = 2时有1个解 ........  y = x-1式有x-2个解。

点击打开链接

题意:给定一个n表示有n个1~n的数,现在要从这里面选出3个不同的整数问可以组成三角形的个数

思路:

1 n的上限是10^6,O(n^2)以上的时间复杂度都无法满足要求

2 设最大的变长为x,另外两边的为y和z并且x y 和z是不同的,那么有y+z > x,因此就有x-y < z < x

   根据这个不等式我们知道,y = 1时无解,y = 2时有1个解 ........  y = x-1式有x-2个解。总的就是0+1+2.......+x-2 = (x-1)*(x-2)/2

3 但是上面的等式并不是正确的数值。因我上面的解包含了y = z的情况,而且每个三角形算了两遍,因为y和x的地位是等价的。我们怎么解决上面的问题呢?

   先解决y = z的情况吧,当y = z的时候x - z < z < x,那么就有x < 2z,有x/2 < z < x,因此满足的z个数有(x-1)-(x/2+1)

那么只要扣掉这些解,再除以2即可。

4 根据上面的推理分析,我们可以知道题目实际上要求的是“最大边长不超过n的三角形的个数”,因为最大变长的范围从3~n,枚举是不可能的。但是我们仔细分析,我们可以事先打好表,ans[n]表示最大边长不超过n的三角形的个数,那么ans[n] = ans[n-1] + [(x-1)*(x-2)/2 - (x-1)-(x/2+1)]/2

代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

typedef long long int64;
const int MAXN = 1000010;

int64 n , ans[MAXN];

int64 getVal(int64 x){
	return ((x-1)*(x-2)/2-(x-1)/2)/2;
}

void init(){
    ans[3] = 0;
    for(int64 i = 4 ; i < MAXN ; i++)
		ans[i] = ans[i-1]+getVal(i);
}

int main(){
	init();
    while(cin>>n && n >= 3)
		cout<<ans[n]<<endl;
	return 0;
}



目录
打赏
0
0
0
0
15
分享
相关文章
HDU 1506 Largest Rectangle in a Histogram(单调栈)
HDU 1506 Largest Rectangle in a Histogram(单调栈)
UVa11296 - Counting Solutions to an Integral Equation(枚举技巧)
UVa11296 - Counting Solutions to an Integral Equation(枚举技巧)
61 0
LeetCode 85. Maximal Rectangle
题意是给定一个二维的零一矩阵,1可以用来围成一些矩阵,题意要求是返回围城矩阵的面积最大值.
112 0
LeetCode 85. Maximal Rectangle
[LeetCode] Maximal Rectangle
This link shares a nice solution with explanation using DP. You will be clear of the algorithm after running it on its suggested example: matrix = ...
682 0
uva 10317 Equating Equations
点击打开链接uva 10317 思路:搜索 分析: 1 给定一个等式判断两边是否相等,如果一个等式相等那么通过移项到同一边可以得到正数的和等于负数 2 那么通过分析1我们可以知道我们可以求出这个等式的所有数字的和,判断和是否为偶数。
775 0
uva562Dividing Coins
题意:给出n枚硬币,每个硬币有自己的面值,将这些硬币均分,有时无法均分,求分出来的两份硬币的最小差值 分析:统计总面值然后用总面值的一半作为背包容量,01背包。 代码: View Code 1 #include 2 #include 3 #include 4 #i...
652 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等