Balanced Teams (USACO Jan Bronze 2014)

既然是bronze,毫无压力的AC了.

就是个深搜,当然加个剪枝--最后一个组不用搜.

恩可以一个一个组分层次dfs,这样会跑得飞起~~也不容易错

#include <cstdio>
int f[13],i,su,tt1,tt2,lev[4],min;
bool has[13];
inline int md(int a,int b,int c,int d){
	tt1=a,tt2=a;
	if(tt1<b)tt1=b;
	if(tt1<c)tt1=c;
	if(tt1<d)tt1=d;
	if(tt2>b)tt2=b;
	if(tt2>c)tt2=c;
	if(tt2>d)tt2=d;
	return tt1-tt2;
}
void dfs(int depth){
	int i,j,k;
	if(depth==3){
		lev[3]=su-lev[0]-lev[1]-lev[2];
		i=md(lev[0],lev[1],lev[2],lev[3]);
		if(i<min) min=i;
		return;
	}
	for(i=0;i<12;++i){
		if(has[i]) continue;
		has[i]=true;
		for(j=i+1;j<12;++j){
			if(has[j]) continue;
			has[j]=true;
			for(k=j+1;k<12;++k){
				if(has[k]) continue;
				has[k]=true;
				lev[depth]=f[i]+f[j]+f[k];
				dfs(depth+1);
				has[k]=false;
			}
			has[j]=false;
		}
		has[i]=false;
	}
}
int main(){
	for(i=0;i<12;++i) scanf("%d",f+i),su+=f[i];
	min=0x7fffffff;
	dfs(0);
	printf("%d\n", min);
	return 0;
}

  

转载于:https://www.cnblogs.com/tmzbot/p/4035720.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值