51 Nod 1509 加長棒(巧妙的隔板法計數)
基準時間限制: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
參考了這位大神程式碼:
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<cmath> using namespace std;
typedef long long LL;
LL a,b,c,l;
LL solve(LL a,LL b, LL c, LL l) //設c為最大邊 { LL cnt=0; for(int z=0;z<=l;z++) { LL x=min(c+z-a-b,l-z); if(x>=0) cnt+=(x+1)*(x+2)/2; } return cnt; }
int main() { //freopen("D:\\input.txt","r",stdin); while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&l)) { LL ans=(l+1)*(l+2)*(l+3)/6; ans-=solve(a,b,c,l); ans-=solve(a,c,b,l); ans-=solve(b,c,a,l); printf("%lld\n",ans); } }