题意:
给a,b,c问以a+x、b+y、c+z为三边且x+y+z<=l,能够成多少个三角形。
思路:
因为l为10^5,所以肯定是一遍过的枚举
我们可以假设哪条边是最长的,然后去枚举长度。
这时候我们要想到正难则反。
我们计算出不能够成三角形的数量,再用总共的减去就好了。
总共的话,我们假设x+y+z=n(0<=n<=l)
对于每个n,我们看成长度为n的尺子,每个刻度可以切2刀。
所以就是(n+1)+n+(n-1)+..+1中方法。其实就是(n+1+1)*(n+1)/2种方法。
然后我们假设一条边作为最长边算3次就好了
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
#define ll __int64
ll fun(ll a,ll b,ll c,ll l)
{
ll ans=0;
for(ll i=max(b+c-a,0LL);i<=l;i++)
{
ll x=min(l-i,a+i-b-c);
ans+=(x+1)*(x+2)/2;
}
return ans;
}
int main()
{
ll a,b,c,l;
while(cin>>a>>b>>c>>l)
{
ll ans=0;
for(ll i=0;i<=l;i++) ans+=(i+1)*(i+2)/2;
ans-=fun(a,b,c,l);
ans-=fun(b,c,a,l);
ans-=fun(c,a,b,l);
printf("%I64d\n",ans);
}
return 0;
}