博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF 317 A. Lengthening Sticks(容斥+组合数学)
阅读量:4505 次
发布时间:2019-06-08

本文共 2998 字,大约阅读时间需要 9 分钟。

传送门:
A. Lengthening Sticks 
time limit per test       
1 second

You are given three sticks with positive integer lengths of a, b, and c centimeters. You can increase length of some of them by some positive integer number of centimeters (different sticks can be increased by a different length), but in total by at most l centimeters. In particular, it is allowed not to increase the length of any stick.

Determine the number of ways to increase the lengths of some sticks so that you can form from them a non-degenerate (that is, having a positive area) triangle. Two ways are considered different, if the length of some stick is increased by different number of centimeters in them.

Input

The single line contains 4 integers a, b, c, l (1 ≤ a, b, c ≤ 3·10^5, 0 ≤ l ≤ 3·10^5).

Output

Print a single integer — the number of ways to increase the sizes of the sticks by the total of at most l centimeters, so that you can make a non-degenerate triangle from it.

Examples
input
1 1 1 2
output
4
input
1 2 3 1
output
2
input
10 2 1 7
output
0
Note

In the first sample test you can either not increase any stick or increase any two sticks by 1 centimeter.

In the second sample test you can increase either the first or the second stick by one centimeter. Note that the triangle made from the initial sticks is degenerate and thus, doesn't meet the conditions.

 

 

大意:

给定三角形的三边a,b,c,然后给定一个长度L。可以把长度 len(len<= L)拆成三份后,添加到a,,b,c任意一边。问能构成的三角形的个数。(a=2,b=2,c=3 和 a=3,b=2,c=2是两种不同的情况)

比如说样例2,1 2 3 1。可以把1加到a上 变成2 2 3,可以把1加到b上 变成1 3 3。所以答案输出2。

思路:

全部情况 - 不构成三角形的情况 = 构成三角形的情况

全部情况:

对于长度len,考虑切2刀分成3部分,因为可以是切在0这个位置上,即可以出现0,0,len这种情况,所以情况一共有C(len+2,2),表示把长度为len的线段,取2个点切开,然后把这三段分配给a,b,c的所有情况。(包括可构成三角形和不可构成三角形)

不构成三角形的情况

一个三角形三边分别为a,b,c,如果a>=b+c,则构不成三角形

首先考虑最长边是a,对于要加的len,分成p和len-p两部分,其中p给a,len-p给b和c。可以确定的是如果a>=b+c,那么p最少可以是0,如果b+c>a,那么p起码得是b+c-a。这样才能满足即使len-p是0的情况下,让a+p>=b+c。

所以枚举p的起点是max(b+c-a,0)。之后考虑len-p分配给b和c的情况有几种。

因为要构成a+p>=b+c+len-p。所以最大可增加的长度是min(len-p,a+p-b-c),(解释一下,len-p是给了a之后剩下来的,a+p-(b+c)是本身要满足a+p>=b+c,最多允许a+p==b+c,所以对这两个值取最小值就是b和c最大可以增加的长度)

记这个最大可以增加的长度为max_addlen,分配给b和c的情况一共有 (max_addlen+1)*(max_addlen+2)/2 种。

这个很容易证明,在max_len中间砍两刀分为3部分,其中2部分给b和c。情况依旧是C(max_addlen+2,2)

所以去枚举增加长度就可以得到构不成三角形的全部情况了。具体看代码,同时注意用long long。

代码:

#include
#define INF 0x3f3f3f3f#define MM(x) memset(x,0,sizeof(x))#define MMINF(x) memset(x,INF,sizeof(x))#define LL long longusing namespace std;LL l;LL solve(LL a,LL b,LL c)//枚举a为最长边时候所有构不成三角形的情况 { LL ans = 0; for(LL i = max(b+c-a,0LL) ; i <= l ; i ++) //起点是max(b+c-a,0LL) { LL max_addlen = min(a+i-b-c,l-i);//给b和c 最大可以增加的长度 ans += (max_addlen+1)*(max_addlen+2)/2; } return ans;}int main(){ LL a,b,c ; cin>>a>>b>>c>>l; LL ans = 0; for(LL i = 0 ; i <= l ; i ++){ ans += (i+1)*(i+2)/2; }//可增加的所有情况 ans -= solve(a,b,c); ans -= solve(b,a,c); ans -= solve(c,a,b); //分别枚举a,b,c是最长边的情况 cout<
<

 

转载于:https://www.cnblogs.com/Esquecer/p/10500020.html

你可能感兴趣的文章
数字,字符串,列表及其内置方法
查看>>
iOS遍历数组的同时删除元素
查看>>
小强的HTML5移动开发之路(16)——神奇的拖放功能
查看>>
zookeeper FastLeaderElection
查看>>
Jquery AJAX如何使用Promise/Deferred实现顺序执行?
查看>>
进度条
查看>>
Delphi加载驱动
查看>>
CPU体系结构(组成部分)
查看>>
HDU 1250 大数加斐波那契数列
查看>>
MySQL学习笔记
查看>>
folly无锁队列正确性说明
查看>>
maven 常用命令
查看>>
spring入门(一) 根据xml实例化一个对象
查看>>
django-创建表的字段属性,表关系
查看>>
docker-ubuntu镜像,nginx镜像
查看>>
2019-07-09 新来的第一天
查看>>
在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()...
查看>>
Resharp使用大全
查看>>
[NEERC 2004] K小数
查看>>
【Mood-10】每个程序员都应该读的30本书
查看>>