uva11401
Posted pandaking
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva11401相关的知识,希望对你有一定的参考价值。
题意如下:输入n,输出有多少种方法可以从1,2,3,…,n中选出3个不同的整数,使得以他们为三边长可以组成三角形。1≤n≤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 }
挂一个大佬的博客:http://www.cnblogs.com/autoint/p/10025671.html
以上是关于uva11401的主要内容,如果未能解决你的问题,请参考以下文章