随笔分类 -  USACO

摘要:【算法】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 阅读(407) 评论(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 阅读(230) 评论(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 阅读(276) 评论(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 阅读(189) 评论(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 阅读(208) 评论(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 阅读(346) 评论(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 阅读(396) 评论(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 阅读(302) 评论(0) 推荐(1)
摘要:【算法】模拟 【难度】★☆☆☆☆这是一道区间合并问题。我的算法如下;对于输入数据:3300 1000700 12001500 2100可得三个区间[300,1000][700,1200][1500,2100]读入时开一个二维数组tt,按顺序读入300,1000,700,1200,1500,2100;其中区间开头的数值做标记1,区间终点做标记-1;这样tt就变成了:[i][0]3001000700120015002100[i][1]1-11-11-1然后顺序遍历这个数组;开一个计数器变量ct=0;每当当前的数标记为1时ct++,标记为-1时ct--;每当ct恰好==0时就完成了一个大区间合并;. 阅读全文
posted @ 2012-01-10 21:59 wsc500 阅读(287) 评论(0) 推荐(0)
摘要:【算法】模拟 【难度】★☆☆☆☆仍然是模拟,但要注意这个项链是环状的。有一种比较先进的办法是把这个项链载入两次,这样就可以从头到尾遍历了。注意白色的珠子不能作为起点。我的程序没有用上面的方法,直接遍历到最后在返回开头。View Code 1 /* 2 ID: wsc5001 3 LANG: C 4 TASK: beads 5 */ 6 #include<stdio.h> 7 #include <stdlib.h> 8 char ch[351]; 9 int n;10 int zhaoqian(int st)11 {12 char goon;13 int i=0,time 阅读全文
posted @ 2012-01-10 21:47 wsc500 阅读(306) 评论(0) 推荐(0)
摘要:【算法】模拟 【难度】☆☆☆☆☆很简单的模拟题,关键是读清楚题,注意如何判断闰年。View Code 1 /* 2 ID: wsc5001 3 LANG: C 4 TASK: friday 5 */ 6 #include<stdio.h> 7 int runnian(int y) 8 { 9 if (y%100==0)10 {11 if (y%400==0)12 return 1;13 else14 return 0;15 }16 if (y%4==0)17 re... 阅读全文
posted @ 2012-01-10 21:39 wsc500 阅读(177) 评论(0) 推荐(0)
摘要:【算法】模拟 【难度】☆☆☆☆☆考察字符串处理。这道题可以边读入边处理。注意审题,题目中没有说送礼者和受礼者的姓名和前面的名单中的名字顺序一样。关键在于字符串的匹配。字符串的匹配可以用一个strcmp函数的。。我忘了这个函数就自己写了一个。。View Code 1 /* 2 ID: wsc5001 3 LANG: C 4 TASK: gift1 5 */ 6 #include<stdio.h> 7 #include<stdlib.h> 8 char pname[10][15]={'\0'}; 9 int n;10 int zhaoren(char shu 阅读全文
posted @ 2011-12-24 21:35 wsc500 阅读(248) 评论(0) 推荐(0)