上一页 1 ··· 47 48 49 50 51 52 53 54 55 ··· 85 下一页
  2011年12月31日
摘要: UVA_10602 这个题目可以用贪心去做。 我们不妨先看一下这样一个贪心的思路,每次我们都去拼需要press的字符数最少的单词,这样做是否可以呢?实际上我们可以找到这样一个反例, 3 aaaab aaaabbb aaaac 如果按这样的贪心思路就会输出 9 aaaab aaaac aaaabbb 但实际上正确的结果为 8 aaaab aaaabbb aaaac 尽管上面的想法是错误的,但我们也或多或少会得到些启发,对于这组测试数据之所以没有最优,是由于相比最优的结果多press了一个b,而之所以多press了这个b,是由于我们一开始没有去拼和aaaab有最大前缀的aa... 阅读全文
posted @ 2011-12-31 20:11 Staginner 阅读(573) 评论(0) 推荐(0) 编辑
摘要: UVA_714 这个题目可以二分每个人分到的页数的上限,然后看能否安排成功并更新相应的max和min值,这样我们就得到了安排给每个人的页数的最大值的最小值。 题目要求输出一个安排方案,并且要求标号越小的人工作量越小,这一点我们可以用贪心策略来保证,只要让标号大的人分配到的工作量尽可能大即可。但同时要求每个人至少要有一本书的工作量,这一点可以在分配工作量时用一个判断,即剩下的书至少要等于劳动力的数量。#include<stdio.h>#include<string.h>#define MAXD 510int K, M, a[MAXD], p[MAXD][MAXD], nu 阅读全文
posted @ 2011-12-31 18:08 Staginner 阅读(703) 评论(0) 推荐(0) 编辑
摘要: UVA_10954 看了别人解题报告之后发现累加的过程可以这样操作,每次取最小的两个元素加和,然后把和当作一个新元素放进集合,直到剩下一个元素,然后把中间结果加起来就是要求的结果。实际上这个题目就是哈弗曼编码,在LRJ树上155页有讲到。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 5010int N, a[MAXD], q[MAXD];int cmp(const void *_p, const void *_q){ int *p = (int *)_p; int *q = 阅读全文
posted @ 2011-12-31 17:02 Staginner 阅读(546) 评论(0) 推荐(0) 编辑
  2011年12月30日
摘要: UVA_270 这个题目我只想到了优化常数的办法,没想到AC了,但耗时还是不容乐观的,这个题好像是有n^2logn的算法,要先进行排序再处理,但暂时还没有找到相应的详细一点的思路。 优化常数的办法就是用一个邻接矩阵记录一下哪两个点以前已经在某条直线上被算过了,那么在枚举的时候就不用再枚举这两个点作为一条直线了。 后来又琢磨了一下看到的那句“按极角排序”的话,恍然大悟了,实际就是把枚举的过程由枚举两个点变成枚举一个点,之后以这个点为原点,将其余所有点按和这个点连线的斜率的大小进行排序,然后去计算每条射线上点的数目(这样是不会丢解的,因为我们枚举了所有点作为原点,必然也就枚举了可能的直线的端... 阅读全文
posted @ 2011-12-30 18:11 Staginner 阅读(882) 评论(0) 推荐(0) 编辑
  2011年12月29日
摘要: UVA_310 一般LRJ选出来的但用户solve率这么少的题目大概都是有trick的,几个月前写过一次,结果交上去只有三种情况WA、TLE、RE。今天又写了一下,结果出乎意料地AC了,所以也说不清当初卡在哪里了。 说一说这次的思路吧,首先a和b的转换字符串u、v都是非空的,w也是非空的,但z可能为空,每次替换都需要把字符串中所有a替换成u,所有的b替换成v,第一次写的时候对这个替换的规则审题审了好久,后来偶然有个机会研究了一下L-System并用Java画了几个L-System的图形,这才对L-System的字符串的演变规则有了更深一点的了解。 明确了规则之后,需要再理解一下下面这个命... 阅读全文
posted @ 2011-12-29 23:59 Staginner 阅读(595) 评论(0) 推荐(1) 编辑
摘要: UVA_10125 核心的思想就是先把a+b的值建一个哈希表,然后枚举d-c的值,如果找到和d-c相同的a+b并且4个元素各不相同的话,就更新一下最后结果。 当然,哈希函数的设计可以随意的,如果超时了不妨换一个。#include<stdio.h>#include<string.h>#include<math.h>#define HASH 1000003#define MAXN 1010#define MAXD 1000010#define INF 1000000000000llint N, head[HASH], next[MAXD], st[MAXD][2 阅读全文
posted @ 2011-12-29 20:44 Staginner 阅读(475) 评论(0) 推荐(0) 编辑
摘要: UVA_10562 建树的过程并不算复杂,找好比较容易处理的一个部分看做一个阶段,然后递归即可。 一开始没有仔细审题,误以为根节点只能是字母,而且还忽略了树为空的情况。#include<stdio.h>#include<string.h>#define MAXD 210int N;char b[MAXD][MAXD];void dfs(int x, int y){ int i, j, k; for(i = y; b[x][i] == '-'; i ++) if(b[x + 1][i] != ' ' && b[x + 1][ 阅读全文
posted @ 2011-12-29 19:47 Staginner 阅读(468) 评论(0) 推荐(0) 编辑
摘要: UVA_839 这个题目虽然是树的结构,但我们可以不必把树的结构建立起来,因为后面可以不必再遍历树了,读入数据的过程本身就是一个遍历树的过程,在这个过程中可以把每个节点的权值计算出来,之后就只需要扫描一遍所有节点,看节点两端是否力矩平衡即可。#include<stdio.h>#include<string.h>#define MAXD 1000010int size, wl[MAXD], wr[MAXD], dl[MAXD], dr[MAXD], d[MAXD], ok;int dfs(){ int k; ++ size; k = size; scanf("% 阅读全文
posted @ 2011-12-29 19:14 Staginner 阅读(331) 评论(0) 推荐(0) 编辑
摘要: UVA_327 模拟题目所说的即可。#include<stdio.h>#include<string.h>#include<ctype.h>#define MAXD 200int pre[MAXD], vis[MAXD], last[MAXD];char b[MAXD], st1[MAXD], st2[MAXD], st3[MAXD];void solve(){ int i, j, k, n1, n2, n3, res; for(i = 'a'; i <= 'z'; i ++) { pre[i] = i - 'a 阅读全文
posted @ 2011-12-29 18:18 Staginner 阅读(445) 评论(0) 推荐(0) 编辑
  2011年12月28日
摘要: UVA_699 模拟题目所说的即可。#include<stdio.h>#include<string.h>#define MAXD 160#define MID 80int first, f[MAXD];void dfs(int cur){ int k; scanf("%d", &k); if(k == -1) return ; if(f[cur] == -1) f[cur] = k; else f[cur] += k; dfs(cur - 1); dfs(cur + 1);}void solve(){ ... 阅读全文
posted @ 2011-12-28 23:41 Staginner 阅读(250) 评论(0) 推荐(0) 编辑
上一页 1 ··· 47 48 49 50 51 52 53 54 55 ··· 85 下一页