HDU 4277 USACO ORZ

本文提供了一道HDU ACM竞赛题目4277的解题思路及代码实现,采用DFS深度优先搜索算法结合set数据结构来找出所有能构成不同三角形的情况。

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4277

题目描述:

该题的意思就是最多给15个数,将其分成三组,然后每组的数加起来,一共三个数,问能否将该三个数组成一个三角形,

最组成不同的三角形的个数。

表示对这题很无语,一个DFS+判重,判重一直TLE,后面参考了解题报告,直接用set解决,用long long 表示这三个数。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std ;

set<long long> s ;
int n, val[20] ;

bool istriangle(int a, int b, int c){
	if( a == 0 || b == 0 || c == 0 )
		return false ;
	if( a+b > c && a+c > b && b+c > a )
		return true ;
	return false ; 	
}
void dfs(int dep, int a, int b, int c){
	if( dep == n ){
		//只需要取a<=b<=c的值进行判断即可
		if( a > b || a > c || b > c ) return ; 
		if( istriangle(a,b,c) ){
			long long tmp = 1000000000000LL*a + 1000000LL*b + c ;
			s.insert(tmp) ;
		}
		return ;
	}	
	dfs( dep+1, a+val[dep+1], b, c ) ;
	dfs( dep+1, a, b+val[dep+1], c ) ;
	dfs( dep+1, a, b, c+val[dep+1] ) ; 
}
int main(){
    //freopen("12.in", "r", stdin);
	int t ;
    scanf("%d",&t) ;
	while( t-- ){
		scanf("%d",&n) ;
		for( int i = 1; i <= n; i++ ){
			scanf("%d",&val[i]) ;		
		}
		s.clear() ;
		dfs(0,0,0,0) ;
		cout << s.size() << endl ;
	}
    return 0 ;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值