题目链接:点击打开链接
题目大意:给出三条边的长度。能够给随意一条边添加随意的长度,可是添加的长度的总和不能超过l。问有多少种添加的方法,可使得三条边任然能组成一个三角形。
用总的方法数-不能组成三角形的方法数
首先求出全部的能添加的方法,假设三条边添加的长度和是l,那么一共同拥有C(l+2,2)种,计算出从0到l的全部的方法。
然后计算不能组成三角形的方法,假设最长边>=另外两边之和,那么就不是三角形,所以分别枚举a+i,b+i,c+i为最长边,然后计算有多少种不可能的办法。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std ; #define LL __int64 LL sum[300100] ; LL solve(int a,int b,int c,int l) { if( a < b+c ) return (LL)0 ; LL ans = min(a-b-c,l) ; return (ans+1)*(ans+2)/2 ; } int main() { int a , b , c , l ; LL i , ans ; while( scanf("%d %d %d %d", &a, &b, &c, &l) != EOF ) { sum[0] = 1 ; for(i = 1 ; i <= l ; i++) { sum[i] = (i+1)*(i+2)/2 + sum[i-1] ; } ans = sum[l] ; for(i = 0 ; i <= l ; i++) { ans -= solve(a+i,b,c,l-i) ; ans -= solve(b+i,a,c,l-i) ; ans -= solve(c+i,a,b,l-i) ; } printf("%I64d\n", ans) ; } return 0 ; }