恐怖的苦力怕 2022-05-22 15:13 采纳率: 40%
浏览 52

给你N个数字,从其中选出三个数字来构成某个三角形的三个边 问有多少种合理的取法c++

Description
给你N个数字,从其中选出三个数字来构成某个三角形的三个边 问有多少种合理的取法(用c++)

Format
Input
第一行给出N

接下来给出N个数字

3≤N≤2×10^3

1≤L i≤10 ^3

Output
如题

Samples
输入数据 1
7
218 786 704 233 645 728 389

输出数据 1
23

输入数据 2
4
1 2 3 4

输出数据 2
1

  • 写回答

1条回答 默认 最新

  • 20240357 2022-05-22 20:41
    关注

    先dfs找三元组,然后判断,时间复杂度O(N^3)
    注意最后要去重/6

    #include<bits/stdc++.h>
    using namespace std;
    int ans=0,a[2009],n,c[4];    //c表示被选的数的编号
                                //三角形判定:任意两边之和大于第三边 
    void dfs(int x,int id){        //x表示当前正在枚举的数是三角形三边的哪一个
                                //id表示选用a数组的第几个 
                                //由于第1个数有n种情况,所以要在main函数里调用dfs(1,i)n次 
        c[x]=id;//记录使用
        if(x==3) {//选满3个 
            if(a[c[1]]+a[c[2]]>a[c[3]]&&a[c[1]]+a[c[3]]>a[c[2]]&&a[c[2]]+a[c[3]]>a[c[1]])//是三角形 
                ans++;
            c[x]=0;//退回,要清除记录
            return;//退回 
        }
        for(int i=1;i<=n;i++)//循环遍历查找 
            if(i!=c[1]&&i!=c[2]&&i!=c[3])//没有出现过
                dfs(x+1,i);//继续调用 
        c[x]=0;//退回,要清除记录    
    }
    int main() {
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++)dfs(1,i);
        cout<<ans/6;//去重,三元组可以有3*2*1=6种不同方法,要算同一种 
        return 0; 
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 5月22日

悬赏问题

  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多