摘要: 《算法竞赛入门经典》5.4.2的题目,题目大意: 给你一个2到100的整数,把n的阶乘表示成素因子相乘的形式,从小到大输出各个素数的指数,例如825=3*52*11表示为(0, 1, 2, 0, 1),表示由0个2, 1个3, 2个5, 0个7, 1个11相乘得到。代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 4 const int prime[25] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 阅读全文
posted @ 2013-05-05 16:11 xiaobaibuhei 阅读(370) 评论(0) 推荐(0)
摘要: 《算法竞赛入门经典》5.3.2的题目,题目大意:输入一个字典,然后再输入若干单词。每输入一个单词w,你都需要在字典中找出所有可以用w的字母重排后得到的单词,并按照字典序从小到大的顺序输出。代码如下:View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 char dict[110][8], sorted_dict[110][8]; 6 7 int cmp_char(const void * _a, const void * _b) 8 { 9 char * 阅读全文
posted @ 2013-05-03 17:59 xiaobaibuhei 阅读(198) 评论(0) 推荐(0)
摘要: 《算法竞赛入门经典》5.4.1的题目,大意是,给出一个数表,如下: 第一项是1/1, 第二项是1/2, 第三项是2/1, 第四项是3/1, 第五项是2/2.....给一个正整数n,求第n项。 设第n个数在第k斜行,则有(k-1)*k/2 + 1 <= n <= k*(k+1) ==> (k-1)2<= k2 - k + 2 <= 2*n <= k2 + k < (k+1)2 ==> k-1 <= sqrt(2*n) < k+1, 因为要k的下界,可以令k = (int)(sqrt(2*n)-1), 从这个值递增枚举。代码如下:View 阅读全文
posted @ 2013-05-03 16:51 xiaobaibuhei 阅读(361) 评论(0) 推荐(0)
摘要: 《算法竞赛入门经典》6.1.2的题目,大意是给一个从1到n的递增序列A和一个1到n的排列B,让你判断能否通过栈操作(压入和弹出)把A转化成B。代码如下:View Code 1 #include <cstdio> 2 #include <stack> 3 using namespace std; 4 5 const int maxn = 1000+10; 6 stack<int> s; 7 8 int main() 9 { 10 #ifdef LOCAL 11 freopen("in", "r", stdin);12 # 阅读全文
posted @ 2013-05-03 15:45 xiaobaibuhei 阅读(684) 评论(0) 推荐(0)
摘要: 《算法竞赛入门经典》6.1的题目。题目大意:给n张牌,放成一叠,从上到下编号从1到n,当至少还有两张牌时,丢弃最上面的牌,然后把新的最上面的牌放到最下面,一直重复,直到只剩下一张牌,输出丢弃牌的序列。 用队列进行模拟,不过第一次提交的时候PE了,格式说明一下:”Discarded cards:“,然后每一数字前加一个空格,第一个数字之后的数字要在空格前加逗号。代码如下:View Code 1 #include <cstdio> 2 #include <cstdio> 3 #include <queue> 4 using namespace std; 5 6 阅读全文
posted @ 2013-05-03 15:13 xiaobaibuhei 阅读(472) 评论(0) 推荐(0)
摘要: 题目大意:给三个正整数n, p, q,判断是否存在这样一个长度为n的序列满足:(1)任何一个长度为p的连续子序列的和为正数;(2)任何一个长度为q的连续子序列的和为负数。如果存在这样一个序列,输出一个这样的序列。 看到这个题目,没有什么想法,不会做...有一个广为流传的zoj题目列表,其中某大牛是这样分析的: 经典的拓扑排序,构造一个长度为 N 的序列,使得序列所有连续 P 个元素之和为正,且所有连续 Q 个元素之和为负。将问题转化,构造这个序列的累加序列,相当于构造一个长度为 N + 1 的序列 S[0..N],满足 S[i+P] - S[i] > 0 且 S[i+Q] - S[i]. 阅读全文
posted @ 2013-04-29 16:15 xiaobaibuhei 阅读(243) 评论(0) 推荐(0)
摘要: 有n件事事情要做,它们有m个完成先后顺序,求出一个它们完成的先后顺序,即拓扑排序。 套用代码即可,不过开始的时候while内条件写的是 while(scanf("%d%", &n, &m) != EOF && n &&m) 结果WA了,怎么都想不明白怎么会错了,后来发现会有n!=0&&m=0的情况出现,不过这样的话它们不是相互独立了吗?当时想当然的就没考虑这种情况,以后还是老老实实地按照题目给的要求吧... 代码如下:View Code 1 #include <cstdio> 2 #include 阅读全文
posted @ 2013-04-27 17:30 xiaobaibuhei 阅读(327) 评论(0) 推荐(0)
摘要: 给一个8*8的棋盘,给出骑士的起点和终点,求出从起点到终点的走的最小步数。这个也是ZOJ 的1091题。 用bfs解决,一个vis数组保存是否访问过,dis数组保存从起点到该点的移动次数。代码如下:View Code 1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 using namespace std; 5 6 queue<int> q; 7 int d[][2] = {{2, 1}, {1, 2}, {-1, 2}, {-2, 1}, {-2, -1}, {-1, - 阅读全文
posted @ 2013-04-25 17:00 xiaobaibuhei 阅读(171) 评论(0) 推荐(0)
摘要: 给一个m*n的矩阵,数字是0或是1,统计其中八连块的个数,和《算法竞赛入门经典》6.4.1黑白图像一样,应该是那个的原型吧。 代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 105; 5 int mat[maxn][maxn], vis[maxn][maxn]; 6 7 void dfs(int x, int y) 8 { 9 if(vis[x][y] || !mat[x][y]) return;10 vis[x][y] = 1;11 dfs(x-1... 阅读全文
posted @ 2013-04-25 15:41 xiaobaibuhei 阅读(203) 评论(0) 推荐(0)
摘要: 给一个先序遍历序列,构建一个二叉树,在垂直方向上给二叉树分列,计算每一列的和。 开始我按照这个序列构建了一个二叉树,然后遍历进行计算,代码如下:View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 5 const int maxn = 199; 6 const int mid = 100; 7 8 struct Node 9 { 10 int value; 11 Node *left, *right; 12 }; 13 14 Node * new_no... 阅读全文
posted @ 2013-04-25 13:28 xiaobaibuhei 阅读(246) 评论(0) 推荐(0)