uva11401

Posted pandaking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva11401相关的知识,希望对你有一定的参考价值。

题意如下:输入n,输出有多少种方法可以从1,2,3,,n中选出3个不同的整数,使得以他们为三边长可以组成三角形。1n≤10^6

一个很简单的想法是递推,首先想想给你一个数n,那么肯定假设前n-1个已经解出,要你求第n个的可以组成的三角形数量,首先可以肯定它最大的一条边已经确定,然后便可以利用枚举第二条边来确定第3条边的可能取值。

对于单条边,我推了一下公式,发现错了,接下来是刘汝佳书上的代码:

技术分享图片
 1 #include <cstring>
 2 #include <cmath>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <cstdio>
 6 using namespace std;
 7 typedef unsigned long long ll;
 8 const int maxn=1000100;
 9 long long f[maxn];
10 int n;
11 int main(){
12     f[3]=0;
13     for(long long i=4;i<=1000000;i++)  f[i]=f[i-1]+((i-1)*(i-2)/2-(i-1)/2)/2;  //要注意long long 和int的区别,如果用int i的话会爆炸,得强制转换
14     //还有不能把式子合并,合并后由于有几个除2,这样会把答案弄错,因为你想得到的是整数而不是小数
15     while(scanf("%d",&n)!=EOF){
16         if(n<3) break;//注意题目条件
17         printf("%lld
",f[n]);
18     }
19     return 0;
20 }
View Code

挂一个大佬的博客:http://www.cnblogs.com/autoint/p/10025671.html

 

 

 

以上是关于uva11401的主要内容,如果未能解决你的问题,请参考以下文章

UVA11401-Triangle Counting-递推

UVA - 11401

UVA 11401Triangle Counting

计数UVA11401 Triangle Counting

uva11401 Triangle Counting

《训练指南》——6.7