标签:
2 2 1 3 1 1 4 3 10 1 1 2 4
2 5HintIn the first example, $ 2, 3 $ are available. In the second example, $ 6, 7, 8, 9, 10 $ are available.
题意大致是:给出已有木棍个数及长度 然后给出可用的木棍的长度范围 现在要再放一根木棍但是要使得任意三根木棍都不能组成三角形 问放的这根木棍的长度共有多少种选择
秉持着两边之和小于等于第三边不能构成三角形
/*
测试数据:
1000
4 1 20
5 6 7 8
4 1 150
2 3 7 100
2 1 1000000000000000000
2 3
4 1 1000000000000000000
2 3 7 100
4 1000000 1000000000000000
2 3 7 100
4 2 3
1 1 1 1
4 1 100
2 3 9 100
2 2 2
1 5
2 2 2
1 1
2 2 2
2 3
*/
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 100010 using namespace std; long long a[maxn]; int main() { int t,n; long long l,r,xl,xr,ans; scanf("%d",&t); while(t--) { scanf("%d%I64d%I64d",&n,&l,&r); for(int i=1;i<=n;++i) scanf("%I64d",&a[i]); ans=0; sort(a+1,a+n+1); xl=l>1?l:1; xr=(a[2]-a[1])<=r?(a[2]-a[1]):r; if(xl<=xr) ans+=xr-xl+1; for(int i=3;i<=n;++i) { if((a[i]-a[i-1])>=l&&(a[i-1]+1)<=r&&(a[i]-a[i-1])>=a[i-1]+a[i-2]) { xl=l>a[i-1]+a[i-2]?l:(a[i-1]+a[i-2]); xr=r<a[i]-a[i-1]?r:(a[i]-a[i-1]); if(xl<=xr) ans+=xr-xl+1; } } if(a[n]+a[n-1]<=r) { if(a[n]+a[n-1]>=l) ans+=r-(a[n]+a[n-1])+1; else ans+=r-l+1; } printf("%I64d\n",ans); } return 0; }
标签:
原文地址:http://blog.csdn.net/wyjwyl/article/details/51944044