摘要: 【算法】DFS 【难度】★★★★☆思路:经典的N皇后问题,但是对于6 <= N <= 13的范围朴素搜索1s内无法出结果。所以要考虑加速。考虑到剪枝的优化空间有限,所以本题才用位运算+DFS。事实上,这个思路来自于Matrix67的文章,按照我自己的理解描述一下:同样是一个DFS的递归,带有三个参数row,lc,rc分别标记这一横行上受到纵列(|)、右倾对角线(\)和左倾对角线(/)上已经放过的棋子的影响有冲突的位置。标记方法是按位表示:用0表示无冲突,1表示有冲突例如,如果一个6皇后的某次的lc二进制下为100101,这表示在第1、4、6个位置受到右倾对角线上已放过棋子的限制,在 阅读全文
posted @ 2012-03-25 20:00 wsc500 阅读(369) 评论(0) 推荐(0) 编辑
摘要: 【算法】贪心 【难度】★☆☆☆☆考查贪心和排序。按题意需要找所需木板的最小总长度,若不考虑木板数目的限制,理论上的最短木板就是把所有有牛的牛棚都盖住。所以贪心算法很明显了。由于木板总数有限,所以在盖住所有有牛的牛棚后,找出连续牛棚之间的空隙,将最短空隙连起来,并重复这一过程,直到木板总数达到要求。View Code 1 /* 2 ID: wsc5001 3 LANG: C 4 TASK: barn1 5 */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 int b[200][4]={0},a[201]={0}; 9 void 阅读全文
posted @ 2012-03-25 19:56 wsc500 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 【算法】模拟 【难度】★★★☆☆关键在于题目分析。此题要求按下C次后符合要求的灯的所有情况。按题意,0<=C<=10000,如果直接枚举所有的情况并判断显然会超时。注意分析题目可知:1、任意一个按钮按下两次相当于一次都没按。利用这一点可以解决所有C>4的情况。由于只有4个按钮,所以C>4时必然至少有一个按钮被按下两次,故所有的情况可归为以下15种:1 2 3 4 12 13 14 23 24 34 123 124 134 234 一个都没按(c==0)2、按下2并按下3相当于按下1。同样的,按下1和2相当于3,按下1和3相当于2。所以以上15种情况可以归为:C==0 一 阅读全文
posted @ 2012-03-25 19:54 wsc500 阅读(262) 评论(0) 推荐(0) 编辑
摘要: 感谢原作者^_^ 我是从这里发现的: http://hi.baidu.com/jwtong_r/blog/item/33ccb6d8ec6d98d6b6fd48db.html来看一个实例,杭电1232畅通工程http://acm.hdu.edu.cn/showproblem.php?pid=1232首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块。像畅通工程这题,问还需要修几条路,实质就是求有几个连通分支。如果 阅读全文
posted @ 2012-03-25 19:47 wsc500 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 【算法】动态规划 【难度】★☆☆☆☆很经典的完全背包问题。详见dd的背包九讲View Code 1 /* 2 ID: wsc5001 3 LANG: C 4 TASK: inflate 5 */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 int c,v; 9 int s[10000+10];10 int t[10000+10];11 int f[10000+10];12 int bigger(int a,int b)13 {14 return a>b?a:b;15 }16 int main()17 {18 freop 阅读全文
posted @ 2012-03-25 19:43 wsc500 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 【算法】模拟 【难度】★☆☆☆☆直接模拟。注意如果牛和人开始绕圈子会陷入死循环,所以在时间足够大的时候退出,具体的临界值我选了10000000,nocow上有证明说最多160000步。【收获】极限情况判断View Code 1 /* 2 ID: wsc5001 3 LANG: C 4 TASK: ttwo 5 */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 struct wz{int x,y,fs;}; 9 int ct=0; 10 int map[12][12];// 0=可通过√ 1=墙x 11 struct wz m 阅读全文
posted @ 2012-03-25 19:40 wsc500 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 【算法】动态规划 【难度】★★☆☆☆这道题花费了很长时间(话说好像没有那道题时间短的)其实很显然是DP,状态转移方程也很容易想到(我是参考了最长公共子序列的思想)。设f[i]表示第i个是否在前缀中,则:{dp[i]=max{dp[j]+j-i}|i到j-1的字串是primitive。 i<j<=n}如果没有i-j<=10最坏情况下就会超时!我在这纠结了半天,参照别人的题解才想到的。还有一点是关于元素的判断。最初是用strcmp但是也会超时。想到了hash,搜了一下有题解说可以把每个元素变成10位2进制数,但是我没找到到底怎么做(= =)。。。所以还是说一下我的方法,也是has 阅读全文
posted @ 2012-03-25 19:38 wsc500 阅读(329) 评论(0) 推荐(0) 编辑
摘要: 【算法】模拟 【难度】★☆☆☆☆这道题不难,关键是长除法。手动模拟一下长除法就会发现,小数部分循环的标志是余数的重复出现。所以记录余数就可以了。注意一下整除的特殊情况就可以了,我因为这个WA了一次。【收获】要注意特判View Code 1 /* 2 ID: wsc5001 3 LANG: C 4 TASK: fracdec 5 */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 int n,d; 9 int checko[100010];10 int ans[100000];11 int main()12 {13 freope 阅读全文
posted @ 2012-03-25 19:34 wsc500 阅读(384) 评论(0) 推荐(0) 编辑
摘要: 【算法】动态规划 【难度】★★★☆☆ 一看就是DP,但是很可惜我完全没有思路= =看了题解,nocow上讲的很透彻,两种方法都很好。首先明确一下题目的意思:用N个点组成一棵深度为K的二叉树,求一共有几种方法? 设dp[i,j]表示用i个点组成深度最多为j的二叉树的方法数,则:dp[i,j]=∑(dp[k,j-1]×dp[i-1-k,j-1])(k∈{1..i-2}) 初始化:dp[1,i]=1我们要求的是深度恰好为K的方法数S,易知S=dp[n,k]-dp[n,k-1]。 但需要注意的是,如果每次都取模,最后可能会有dp[n,k]<dp[n,k-1],所以可以用S=(dp[n, 阅读全文
posted @ 2012-03-25 19:16 wsc500 阅读(284) 评论(0) 推荐(1) 编辑