摘要: 题意:推箱子 要求在推的次数最少的情况下,人移动次数最少分析:pu[x1][y1][x2][y2]、mo[x1][y1][x2][y2]记录人在x1,y1 箱子在x2,y2时的最少推动次数和最少人移动次数。const int maxn=1000000;int n,m,pp,p,ans,bestp,bestm;char c[25][25];struct node{ int x1,y1,x2,y2,pus,mov; int pre; char op;}nd[maxn];int mo[20][20][20][20],pu[20][20][20][20];int tx[]={-1,... 阅读全文
posted @ 2013-06-20 20:03 心向往之 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 题意:在一个固定大小为10x15的矩形区域A内被RGB三种颜色的小球填满。现在按如下步骤操作:1、 删除区域A内最大的一片区域M(任意颜色都可以,只要其占有区域最大)2、 删除M后,自然会出现空的位置,在M区域上方的小球自然下落;当删除M后出现空列时,右边的列往左填充。注意是以“列”为单位填充,非空列只能整列往空列移动。移动后,各个小球之间的相对顺序 与 移动前一样。3、 当区域A剩余小球数为0,或A内的最大区域为1时,游戏结束。char b[10][16],c[10][16];int best_i,best_j,best_cnt;int now_i, now_j, now_cnt;int s 阅读全文
posted @ 2013-06-20 19:59 心向往之 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 题意:有一块边长为N的正方形的大蛋糕,现在给出n块不同尺寸的正方形的小蛋糕的边长,问是否能把大蛋糕按恰好切割为这n块小蛋糕,要求每块小蛋糕必须为整块。分析:用a[i]==j表示第i 行已填的长度为j,排序后相同的小蛋糕不重复考虑。由于小蛋糕边长范围为1~10,所以可以用b[1~10]分别表示边长为1~10的小蛋糕个数int a[50],N;//大方快每行已填长度int b[18],n; //小方块边长int c[18]; //小方块是否用过int s; //当前已用的小方块数int ans=0;void zuishao(int &p1,int &p2,int &lent 阅读全文
posted @ 2013-06-20 19:49 心向往之 阅读(127) 评论(0) 推荐(0) 编辑
摘要: 题意:某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1、m2、m3、...、mn个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:带宽bandwidths 和 价格prices。现在每种设备都各需要1个,考虑到性价比问题,要求所挑选出来的n件设备,要使得B/P最大。其中B为这n件设备的带宽的最小值,P为这n件设备的总价。分析:方法一 按带宽升序排序,从小到大枚举dev[]中各个设备的带宽,枚举B值的过程中,若发现B值比某种设备的最大带宽更大,则无需继续枚举。方法二(最优) 输入时确定最小带宽min和最大带宽max,从min到max枚举带宽i作为最小带宽, 阅读全文
posted @ 2013-06-20 19:44 心向往之 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 题意:长度相同的原始木棍被砍断,现在想将小木棍拼接成原始木棍,求原始木棍的最小可能长度。分析:经典剪枝1.越长的木棍对后面木棍的约束力越大,因此要把小木棍排序,按木棍长度从大到小搜索,这样就能在尽可能靠近根的地方剪枝。2.当前木棍能恰好填满一根原始木棍,但剩余的木棍无法组合出合法解,如果用更短的木棍组合来代替这根木棍,当前木棍不可能和剩下的其它木棍组合出合法解。3.考虑每根原始木棍的第一根木棍,如果无法得出合法解,就不必考虑下一根木棍了,因为当前木棍一定是作为某根原始木棍的第一根木棍。4.跳过重复长度的木棍。5.最后一根木棍不必搜索,因为原始木棍长度是总木棍长度的约数。int a[1000], 阅读全文
posted @ 2013-06-20 19:41 心向往之 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 题意:第一行数字是邮票的面值,每一个数字就是一个不同的种类,哪怕面值相同。第二行数字是顾客所需要的邮票总面值。每个数字就是一个顾客的需求。顾客是集邮爱好者,所以必须尽可能的给他不同种类的邮票。但是一位顾客最多只能拿4张邮票。满足顾客需求的解就是可行解。邮票种类最多的可行解为最优。如果存在两个以上的最优解的邮票种类是一样的,张数最少的更优张数也一样的话,这些最优解中最大面值较大的更优。若邮票种类、张数、最大面值三者都分别相同,则认为这些最优解相同,输出tie。没有解就是none。分析:1、最多拿四张邮票,如果同一面值的邮票种类超过5,以5计算。为什么不以4计算呢,因为tie。2、若DFS的深度超 阅读全文
posted @ 2013-06-20 19:30 心向往之 阅读(348) 评论(0) 推荐(0) 编辑
摘要: 题意:游戏 http://www.hacker.org/push棋盘上有几个箱子,可以找个空地,放置'推子'。然后横向或竖向推动,直到遇到箱子,将箱子数减1,推到下一格,若下一格也有箱子,则两者相加。 推子在第一个箱子的原位置。 推子和箱子之间至少有一个空格才能撞动箱子。分析:深搜。找到任意一种解决方案即可。 注意: 一开始放推子的时候,只能放在空地上。 这点没注意到卡了N小时。char c[30][30];int a[30][30];int n,m,count,flag;int dir[2][4]={{ -1, 1, 0, 0 }, { 0, 0,-1, 1 ... 阅读全文
posted @ 2013-06-20 13:48 心向往之 阅读(408) 评论(0) 推荐(0) 编辑
摘要: 1429题意:这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。分析:用b[x][y][s]代表在x,y 阅读全文
posted @ 2013-06-20 13:42 心向往之 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 题意:密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N (0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码), 最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.分析:广搜, 结构体记录 密码下标、前驱、余数、长度。每次(余数*进制+新数)%N 求得新的余数,若为0,则找到密码,若超过500位,则无解。余数如果以前出现过,则舍弃。bool b[15010];char c[20];int a[20];int T,N,C,M,p;struct node{ i... 阅读全文
posted @ 2013-06-20 13:39 心向往之 阅读(206) 评论(0) 推荐(0) 编辑