HDU 4277  USACO ORZ

本文介绍了一种解决特定问题的方法:使用给定的边长集合来形成尽可能多的三角形,并通过简单的搜索算法和判重策略实现。利用C++编程语言进行实现,通过递归搜索所有可能的组合,并确保每个三角形的独特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:题目给出n条边 , 要求用这n条组成一个三角形 , 问最多能成多少个三角形?

这题真的是一个水题 , 可能当时题目读错了(英文差啊) , 后面做得时候又一直超时 , 看大神的解题报告之后才知道真的很简单。

简单的搜索加判重

判重可以用 hash 、 set+运算符重载

代码:
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #define LL long long 
    #define N 25 
    using namespace std; 
    int num[N]; 
    int n,summ,xj,xk; 
    int Case; 
    struct node  //要去学学
   
        int x,y,z; 
        bool operator < (const struct node &a) const 
        {
            return (x!=a.x)?(x
        }
    }temp,ans; 
    set hashx; 
    void dfs(int); 
    int main() 
   
        scanf("%d",&Case); 
        for(int c=0;c
       
            summ=0;hashx.clear(); 
            scanf("%d",&n); 
            for(int i=1;i<=n;i++) 
           
                scanf("%d",&num[i]); 
                summ+=num[i]; 
           
            temp.x=num[1];temp.y=0; 
            if(n<3) 
           
                printf("%d\n",0); 
                continue; 
           
            dfs(2); 
            printf("%d\n",hashx.size()); 
       
        return 0; 
   
    void dfs(int x) 
   
        if(x>n) 
       
                    xj=temp.x; 
                    xk=temp.y; 
                    if(((xj+xk)>(summ-xj-xk))&&(summ-xk>xk)&&(summ-xj>xj)) 
                   
                        ans.x=max(xj,max(summ-xj-xk,xk)); 
                        ans.z=min(xj,min(summ-xj-xk,xk)); 
                        if(xj!=ans.x&&xj!=ans.z) ans.y=xj; 
                        else if(xk!=ans.x&&xk!=ans.z) ans.y=xk; 
                        else ans.y=summ-ans.x-ans.z; 
                        hashx.insert(ans); 
                   
                    return; 
       
        dfs(x+1); 
        temp.x+=num[x]; 
        dfs(x+1); 
        temp.x-=num[x]; 
        temp.y+=num[x]; 
        dfs(x+1); 
        temp.y-=num[x]; 
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值