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 阅读(271) 评论(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 阅读(246) 评论(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 阅读(360) 评论(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 阅读(371) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示