UVA - 11401

题目链接:https://odzkskevi.qnssl.com/583fd2a28323fc85d699b873c944c7aa?v=1535670027

题目大意:给出n根小棍,问可以构成多少三角形?

思路:

先定义一个函数f(n):当最大编程为n时所能构成的三角形数目。

对于三角形的三边而言,我们可以设定为x,y,z。并且我们假设x是最大边。那么我们有y+z>x,因此可以推出x-y<z<x。

根据这个不等式我们有,当y=1时,显然无解;当y=2时,有一个解;当y=3时,有两个解;·····当y=x-1时有x-2个解。根据等差数列求和公式我们有一共有

0+1+2+······+(x-2)=(x-1)(x-2)/2。但是我们需要注意,这里包含了y=z情况。那么我们需要减去从y=x/2+1开始到y=x-1为止,此时我们多计数了(x-1)-(x/2+1)+1=(x-1)/2个解,而且除此之外,我们对于每一个y我们都有重复计数,因为前后是对称的。所以我们最后还要除以2得到最终结果。

举个例子:x=6。

xyz
610
25
34,5
43,4,5
52,3,4,5

 

AC代码:

 


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<sstream>
#include<stack>
#include<map>
#define INF 0x3f3f3f
typedef long long ll;

using namespace std;
const int maxn=1000000+10;

ll f[maxn];
int main(){
	ll n;
	f[1]=f[2]=f[3]=0;
	for(ll i=4;i<maxn;i++){
		f[i]=f[i-1]+((i-1)*(i-2)/2-(i-1)/2)/2;
	}
		while(cin>>n){

			if(n<3)break;

			cout<<f[n]<<endl;

		}
		return 0;
	}

 

本题要注意一点是:多组输入,当输入n小于3时退出,不然会导致超时。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值