中石油 N. Triangular Collection(组合数学)

该博客讨论了一道算法题目,要求在给定的n条边中选择m条,确保任取3条都能构成三角形。通过排序边长并固定两端点,判断中间元素是否满足三角形条件,来找出所有可能的集合。博主提供了详细的解题思路和代码实现,重点在于如何优化搜索过程以提高效率。
摘要由CSDN通过智能技术生成

题目链接

题意:

给出你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 2rpos1不可以不放(不放就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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值