上一页 1 ··· 24 25 26 27 28 29 30 31 32 ··· 85 下一页
  2012年4月30日
摘要: URAL_1007 按题目的要求依次检查各个可能出错的位置即可。#include<stdio.h>#include<string.h>#define MAXD 1010int N, M, A[MAXD], S;char b[MAXD];void checkreplace(){ int i, j, k; for(i = 0; i < M; i ++) if(b[i] == '1' && (S - i - 1) % (N + 1) == 0) { b[i] = '0'; printf("%s\n", 阅读全文
posted @ 2012-04-30 21:08 Staginner 阅读(270) 评论(0) 推荐(0) 编辑
摘要: URAL_1005 由于石头的数量很少但重量的区间跨度比较大,所以不妨直接暴力。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 30int N, a[MAXD], ans, A[MAXD], S;int cmp(const void *_p, const void *_q){ int *p = (int *)_p, *q = (int *)_q; return *p < *q ? 1 : -1;}void init(){ int i, j, k; for(i = 0; 阅读全文
posted @ 2012-04-30 16:47 Staginner 阅读(323) 评论(0) 推荐(0) 编辑
摘要: URAL_1004 可以枚举起点和终点做O(N^2)次dij,也可以用floyd直接求最小环,但是用floyd的效率要高一些。View Code (Dijkstra)#include<stdio.h>#include<string.h>#define MAXD 110#define MAXM 20010#define INF 0x3f3f3f3fint N, M, D, first[MAXD], next[MAXM], e, v[MAXM], w[MAXM], dis[MAXD];int tree[4 * MAXD], q[MAXD], res, n, p[MAXD]; 阅读全文
posted @ 2012-04-30 16:25 Staginner 阅读(245) 评论(0) 推荐(0) 编辑
摘要: URAL_1003 这个题目可以用并查集做,类似“食物链”的题目。只不过由于N的范围比较大,一开始可以先离散化一下。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 100010int N, Q, a[MAXD], p[MAXD], d[MAXD];struct Que{ int x, y; char b[5];}que[MAXD];int cmp(const void *_p, const void *_q){ int *p = (int *)_p, *q = (int *) 阅读全文
posted @ 2012-04-30 01:44 Staginner 阅读(359) 评论(0) 推荐(0) 编辑
摘要: URAL_1002 dp的思路还是比较好想的,可以用f[i]表示递推到第i个数字的时候最短用几个单词表示。这样只要枚举当前单词的起始位置j,如果j~i可以构成一个单词,那么就尝试更新f[i],而判断j~i是否可以构成一个单词的过程可以用哈希表实现。#include<stdio.h>#include<string.h>#define INF 0x3f3f3f3f#define HASH 1000003#define MAXD 50010#define MAXL 60#define MAXN 110int N, head[HASH], next[MAXD], f[MAXN] 阅读全文
posted @ 2012-04-30 01:12 Staginner 阅读(367) 评论(0) 推荐(0) 编辑
  2012年4月26日
摘要: HDU_3658 可以用f[i][j]表示第i个字符为j时满足要求(有至少一对相邻的字符的ASC码值之差是32)的合法(任意一对相邻的字符的ASC码值之差都不超过32)字符串个数,g[i][j]表示第i个字符为j时不满足要求但合法的字符串个数。找到递推关系之后构造矩阵并用二分矩阵的方法求解即可。#include<stdio.h>#include<string.h>#define MAXD 110#define D 1000000007int N;struct Matrix{ int a[MAXD][MAXD]; Matrix() { memset(a, 0, s... 阅读全文
posted @ 2012-04-26 22:31 Staginner 阅读(258) 评论(0) 推荐(0) 编辑
摘要: HDU_2971 这个题目和HDU_3306的原理是一样的,具体的一些思路可以参考我的HDU_3306的解题报告:http://www.cnblogs.com/staginner/archive/2012/04/26/2471507.html。 只不过这个题目中递推关系的矩阵中有负的元素,为了后面运算起来方便,我们可以先将其通过模运算转化成正数。#include<stdio.h>#include<string.h>#define MAXD 4int N, M, a2;struct Matrix{ int a[MAXD][MAXD]; Matrix() { m... 阅读全文
posted @ 2012-04-26 16:21 Staginner 阅读(376) 评论(0) 推荐(0) 编辑
摘要: HDU_3306 由于N很大,所以需要在找出递推关系的基础上用二分矩阵来优化计算过程。 根据S(n)=S(n-1)+A(n)^2,A(n)^2=X^2*A(n-1)^2+Y^2*A(n-2)^2+2*X*Y*A(n-1)*A(n-2),A(n)*A(n-1)=Y*A(n-1)*A(n-2)+X*A(n-1)^2,可以构造如下的矩阵,然后用二分矩阵的方法求解即可。 #include<stdio.h>#include<string.h>#define D 10007#define MAXD 4int N, X, Y;struct Matrix{ int a[MAXD][MA 阅读全文
posted @ 2012-04-26 15:36 Staginner 阅读(613) 评论(0) 推荐(0) 编辑
摘要: HDU_1588 不妨设F为像下图一样的含有fibonacci项的矩阵,那么最后结果就是矩阵S(n-1)=F^(b)+F^(k+b)+…+F^(k*(n-1)+b)左上角的元素。 对于矩阵S和F,可以得到递推公式S(n)=S(n-1)+F^(k*n+b),F^(k*(n+1)+b)=A^(k)*F^(k*n+b),矩阵A为下图所示的矩阵。于是我们就可以将这个两个递推式构造成一个递推关系的矩阵,然后再用二分矩阵的方法快速求得S(n-1)即可。 #include<stdio.h>#include<string.h>#define MAXD 8int K, B, N, M;s 阅读全文
posted @ 2012-04-26 13:43 Staginner 阅读(260) 评论(0) 推荐(0) 编辑
摘要: FZU_1683 利用递推关系可以构造出下图所示的矩阵,然后用二分矩阵求解就可以了。 由于递推关系的矩阵是固定了,所以不妨先把二分矩阵中用到的递推关系的矩阵的2^x(0<=x<32)次幂预处理出来,这样可以节省一些时间。 #include<stdio.h>#include<string.h>#define MAXD 4#define D 2009int N;struct Matrix{ int a[MAXD][MAXD]; Matrix() { memset(a, 0, sizeof(a)); } void init() { ... 阅读全文
posted @ 2012-04-26 11:41 Staginner 阅读(305) 评论(0) 推荐(0) 编辑
上一页 1 ··· 24 25 26 27 28 29 30 31 32 ··· 85 下一页