51nod-1509 加长棒(组合数学+挡板法)

原题链接

题目来源:  CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40  难度:4级算法题
 收藏
 关注

现在有三根木棒,他们的长度分别是a,b,c厘米。你可以对他们进行加长(不同的木棒可以增加不同的长度),他们总的加长长度不能超过L厘米。你也可以不对他们进行加长。

现在请你计算一下有多少种加长的方式使得他们能构成合法的三角形(面积非0)。

Input
单组测试数据。
共一行,包含4 个整数a,b,c,L (1≤a,b,c≤3*10^5, 0≤L≤3*10^5)。
Output
输出答案占一行。
Input示例
1 1 1 2
Output示例
4
某大牛思路:

解题思路:

这个题目直接想的话 没法做,所以就是间接的想,也就是采用容斥原理从反面来想,也就是说 用总数减去不能够满足三角形的方法数,那么先来

求总数,因为现在的问题是将  L  分成四份, 一份给  a  一份给  b  一份给  c  剩下的就是剩下的了,那么分成的四份可能有  0 , 不满足

挡板法的条件,所以我们就将  L+4  ,那么现在在分成四份就符合条件啦,所以总的方法数就是  C(L+41,41) , 那么现在再来求不满足

三角形条件的方法数,因为三角形一定满足一个条件是   所以我们只要求出 两条较小的边小于等于最大边就不满足条件了,

然后根据这个可以列一个方程,假设  a  现在加上了  x  ,  b  现在加上了  y  , c  现在加上了  z (假设 a 是最大边),方程如下:

b+y+c+za+x

然后因为所有数的和一定是  a+b+c+L ,所以最大值不可能超过  a+b+c+L ,那么  b+ca+b+c+L(a+x)  综上 所以有  b+cmin(a+b+c+La,a+x)

然后在利用挡板法求出 不能组成三角形的方法数,是  C(minbc+2,2)  所以就可以写了。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
#define maxn 1000005
#define INF 1000000009
typedef long long ll;
using namespace std;

ll solve(ll a, ll b, ll c, ll m){
	ll k = 0;
	for(ll i = 0; i <= m; i++){
		ll temp = min(m+a+b+c-a-i, a+i);
		if(temp < b + c)
		 continue;
		temp -= b + c;
		k += (temp+2) * (temp+1) / 2;
	}
	return k;
}
int main(){
	
	ll a, b, c, m;
	scanf("%I64d%I64d%I64d%I64d", &a, &b, &c, &m);
	ll ans = (m+3) * (m+2) * (m+1) / 6;
	ans -= solve(a, b, c, m);
	ans -= solve(b, a, c, m);
	ans -= solve(c, a, b, m);
	
	cout << ans << endl;
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值