题目链接
题意:
给出你n条边,让你从这n条边中取m(m>=3)条边使得这m条边这个集合中,任意选3条边都能构成三角形,问你一共有多少这样的集合.
数据量是n<=50
题解:
首先我们要知道构成三角形的三条边的条件,两边之和大于第三边(最长边)
知道这个条件之后,我们就知道这个其实还是根大小有关的,所以我们可以对其排序,得到一个新序列.之后我们顺其自然的想到固定两个端点
(
l
,
r
)
(l,r)
(l,r)(都是下标),这个我们就可以知道最大和最小的限度,这样就可以往里面加
l
l
l到
r
r
r的元素.满足条件再加,假设第一个满足条件的下标是
p
o
s
pos
pos那么
p
o
s
pos
pos之后的都能满足条件,所以可以加入的最大个数为(r-pos)(互不影响,因为最大最小固定了).
之后我们求答案是
2
r
−
p
o
s
−
1
2^{r-pos}-1
2r−pos−1不可以不放(不放就2条边不能构成三角形).
感谢代码提供者yiui.
ll n=read;
for(int i=1;i<=n;i++) a[i]=read;
sort(a+1,a+1+n);
ll res=0;
for(int l=1;l<=n;l++){
for(int r=l+2;r<=n;r++){
int pos=-1;
for(int i=l+1;i<r;i++){
if(a[i]+a[l]>a[r]){
pos=i;break;
}
}
if(pos!=-1){
res=res+ksm(2,r-pos)-1;
}
}
}
printf("%lld\n",res);