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;
}

  

时间: 2024-10-12 09:51:03

Balanced Teams (USACO Jan Bronze 2014)的相关文章

USACO JAN 2012 Bronze

Problem 1: Gifts [Kalki Seksaria and Brian Dean, 2012] Farmer John wants to give gifts to his N (1 <= N <= 1000) cows, using his total budget of B (1 <= B <= 1,000,000,000) units of money. Cow i requests a gift with a price of P(i) units, and

【CF1133E】K Balanced Teams(动态规划,单调队列)

[CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素可以被分组. 题解 设\(f[i][j]\)表示把前\(i\)个数分成\(j\)组的最多人数. 然后单调队列转移一下完了. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring&g

题解CF1133E K Balanced Teams

题目:CF1133E K Balanced Teams 拿到手第一想法就是算一下每个人可以和他分一起的,然后贪心.很显然在1s内被自己hack.所以贪心不行优先考虑dp.看到n和k的范围明显是个O(n^2)的dp. 由于我们不考虑顺序,按常规把水平排个序. 我的最初想法: 设f[i][j]:前i个人分了j组的最大和. 1.h[i]-h[lst]<=5 我们可以把他分到j-1组也可以分到第j组 2.h[i]-h[lst]>5 只能把i分到第j组 但我们遇到一个问题,就是我们不清楚第j-1组的开头

Balanced Photo(USACO)

题目大意: 我们有一个数列,数列中有n个数,对于一个数ai,在它左边的比他大的数的个数为li,右边比他大的数的个数为ri,若li,ri中的较大者比较小者的两倍还大,那么他就是一个不平衡数,求不平衡数的数量. 好吧,典型逆序对. 因为我们要求左边比他大的数的个数,所以我们倒着排序,然后再离散. 然后树状数组解决问题. 那么右边怎么办? 很显然我们得到的离散数组的值就是比他大的数的个数+1(它本身),所以右边的答案为:离散数组值-左边比他大的数的个数-1: 然后轻松统计答案 下面贴代码 #inclu

[usaco jan 09] 气象牛 baric [dp]

题面: 传送门 思路: 题意有点绕,实际上就是给你一个计算规则,让你取最少的元素,通过这个计算方式,得到一个小于指定误差上限的结果 这个规则分为三个部分,这里分别用pre,sum,suf表示 因为给定的元素个数(天数)很少,可以使用O(n^3)算法,因此考虑使用经过了预处理的dp解决问题 具体地,设dp[i][j]表示前i个元素使用了j个且一定取用了第i个时可能达到的最小误差值 预处理:pre[i]表示通过第一种计算方式得到的,第一个元素取第i个时得到的误差 suf[i]同理,为第三种计算方式

[usaco jan 09] 安全路径 travel [最短路径树]

题面: 传送门 思路: 既然最后一条边不能走,那么就一定是换了一条路,一条不经过这最后一条边的路 如果想要这条路最短,那么其在路上一定尽可能多地走了最短路径 因此,我们对这张图跑一遍从1开始的单源最短路,并建立出最短路径树 那么新的路径(1->u)一定是这样构成的:(1->v)+edge(v,w)+(w->u),其中w是u在最短路径树上的后代 那么,我们对于每一条非树边(u,v),其树上路径上所有点(除了lca)的答案,都可以被dis[u]+dis[v]+w(u,v)-dis[路径上的点

codeforces 1133E K Balanced Teams

题目链接:http://codeforces.com/contest/1133/problem/E 题目大意: 在n个人中找到k个队伍.每个队伍必须满足最大值减最小值不超过5.求满足条件k个队伍人数的总和的最大值. 这个题写DP很多的人应该可以很快写出来吧,毕竟不是很难. 思路: 反正最多n^2种状态.用数组存就好了. 先排序. 对于每个点,dp[a][b].表示a到n区间里分b个队伍的答案. 如果a是答案dp[a][b]所需要的,那么我们从a开始到a+i暴力一下(此时,x[a+i]-x[a]>

CF #544 div3 E. K Balanced Teams

题意:有n个学生 要求组成k个小组 每个小组中两两差值不得超过5 可以有学生不被编入组中 求最多可以有多少个学生被编入组中 n,k<=1e5 题解: 考虑dp[i][j],i为前i个学生,j为分了几组的最大人数,不选第i个人,dp[i][j]=dp[i-1][j], 选第i个人,贪心的选择距离a[i]小于等于5的最远那个点-1,记作pos[i],dp[i][j]=dp[pos[i]][j-1]+i-pos dp[i][j]=max(dp[i-1][j],dp[pos[i]][j-1]+i-pos

包管理工具rpm和yum的用法

包管理工具rpm和yum的用法 一.rpm的用法 rpm原本是Rde Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐收到其他发行版的采用,RPM套件管理方式的出现,让Linux易于安装.升级,间接提升了Linux的适用性. rpm用法:rpm [OPTION...] 1.rpm安装软件包,后面需要跟上程序包文件的绝对路径或相对路径 常用选项: -v:显示指令的执行过程 -vv:详细显示指令执行过程,便于排错 -h:以#号显示程