POJ
文章平均质量分 67
相门码农
这个作者很懒,什么都没留下…
展开
-
POJ1840《Eqs》方法:哈希
题目大意:给定系数,求a1*x1^3+a2*x2^3+a3*x3^3+a4*x4^3+a5*x5^3 = 0方程式解的个数。系数和x范围都是[-50, 50]但不包括0。解题思路:不能暴力穷举,因为穷举的话会有5层循环,每层循环100个数,总共就有100^5种情况,肯定超时。因此上式转化为-(a1*x1^3+a2*x2^3) = a3*x3^3+a4*x4^3+a5*x5^3,循环层数就变原创 2013-03-26 14:40:00 · 676 阅读 · 0 评论 -
POJ1936《All in All》
直接暴力求是否是子串,就是在子串中加入一些字母。LCS的方法以后再想吧。#include #include #include using namespace std;int main(){ //freopen("temp.txt", "r", stdin); long i, j, lens, lent; char s[100001], t[100001]; while (原创 2013-03-19 10:22:29 · 646 阅读 · 0 评论 -
POJ3080《Blue Jeans》方法:暴力
求最长公共子序列,这题直接暴力枚举了,先枚举长度为1,然后2...n。以后再用kmp和后缀数组试试。#include #include #include using namespace std;#define LEN 60int main(){ //freopen("temp.txt", "r", stdin); int cases, n; cin >> cases;原创 2013-03-18 13:53:05 · 581 阅读 · 0 评论 -
POJ1016《Numbers That Count》方法:模拟
简单的模拟#include #include #include using namespace std;void R(const char *s, char *t){ int d[10], j = 0; // 记录0到9各数字出现次数 memset(d, 0, sizeof(d)); for (int i = 0; s[i]; ++i) { ++d[s[i]-'0'];原创 2013-03-15 20:36:35 · 535 阅读 · 0 评论 -
POJ1035《Spell checker》方法:模拟
就是辨别单词和字典中相等或多一个字母或少一个字母的情况。#include #include #include using namespace std;char dict[10001][16];char word[51][16];int dictnum = 0;int wordnum = 0;bool change(char *s, char *t){ int dif原创 2013-03-16 16:59:19 · 465 阅读 · 0 评论 -
POJ1459《Power Network》方法:Dinic
采用先分层,再用DFS找增广路的的方法。O(n^2m)#include #include using namespace std;#define min(a,b) (a<b?a:b)#define MAXN 105const int inf = 0x7fffffff;struct { int flow; int capacity;} map[MAXN][MAXN];i原创 2013-03-14 16:58:03 · 500 阅读 · 0 评论 -
POJ1459《Power Station》方法:EdmondsKarp
最大流问题,只不过该题需要另外新建一个源点和汇点,悲催的是用EdmondsKarp算法超时了,O(nm^2)。#include #include #include #include using namespace std;#define min(a,b) (a<b?a:b)const int inf = 0x7fffffff;class {public: int flo原创 2013-03-12 16:11:45 · 484 阅读 · 0 评论 -
POJ1258《Agri-Net》方法:Prim
非常典型的找最小生成树。#include #include #include using namespace std;const int inf = 0x7fffffff;int n; //节点数int w[101][101]; //边权int dis[101];bool v[101];void prim(){ int s = 1, sum = 0, min; d原创 2013-03-04 11:46:38 · 320 阅读 · 0 评论 -
POJ2485《Highways》方法:Prim
求最小生成树的最大边。#include #include #include using namespace std;const int inf = 0x7fffffff;int n; // 点数int w[501][501];int dis[501];bool v[501];void prim(){ int s = 1, min, minmax = 0; dis[原创 2013-03-03 12:46:50 · 289 阅读 · 0 评论 -
POJ1789《Truck History》方法:Prim
以序列字符的不同数为边权,求一颗最小生成树,这里注意松弛操作与Dijkstra的区别。Prim: if (!v[j] && dis[j] > w[s][j]) Dijkstra: if (!v[j] && dis[j] > dis[s] + w[s][j]) #include #include #include using namespace std;const int i原创 2013-03-02 16:12:59 · 319 阅读 · 0 评论 -
POJ3083《Children of the Candy Corn》方法:DFS+BFS
有一个迷宫,需要先在左转或右转为优先选择的情况下,利用深度优先搜索分别找一条路径,可返回。然后是用宽度优先搜索找最短路,不可返回。#include #include #include #include ;using namespace std;typedef struct { int x, y; int depth;} node_t;node_t node[1601]; /原创 2013-03-13 13:35:52 · 511 阅读 · 0 评论 -
POJ1125《Stockbroker Grapevine》方法:Floyd
求一个网络中,从哪一点连接开始,到其他所有点的最长距离。就是求某点开始到其他点最长距离的最小值。#include #include #include using namespace std;const int inf = 100; // 最大10int n; // 总人数int path[101][101];void floyd(){ for (int k = 1; k原创 2013-03-01 10:07:51 · 344 阅读 · 0 评论 -
POJ1062《昂贵的聘礼》方法:dijkstra
娶酋长媳妇需要10000,但是在拥有物品2时就需要8000,有物品3时需要5000,并且交易时不能和超过等级差的人先后交易,所以每一次先以当前等级为最大等级并且不超过等级差,dis[1]为目标点,运用dijkstra求单源最短路径,每一次的源点是从最小的dis[i]开始。#include #include #include #include using namespace std;原创 2013-02-27 21:55:29 · 327 阅读 · 0 评论 -
POJ2002《Squares》方法:哈希
题目大意:给定平面上的一些坐标点(1000个),找出这些点能构成多少个正方形,坐标取值不大于20000。解题思路:若遍历4个点的坐标,肯定超时。因此先取两个点坐标,然后用哈希值查找正方形的另两个点坐标,key = (x*x+y*y)%prime,这里prime取1999(不大于2n的素数),并用链地址法解决地址冲突。因为每个正方形按不同顺序被枚举了4次,所以要除以4。// 620k 136原创 2013-04-01 10:40:27 · 610 阅读 · 0 评论 -
POJ1007《DNA Sorting》方法:排序
题目大意:给定一组DNA序列,只包含A,C,G,T,按每个序列的逆序数排序。比如DCBA,逆序数为3+2+1=6。解决方法:求每一个DNA序列逆序数,从序列的后面向前遍历,eg.如果遇到C,就加上之前A和B的数量,同时自身加一,然后根据逆序数快排,如果逆序数相等,则按照原始顺序,可用qsort。//208k 0ms#include #include #include using原创 2013-03-20 09:57:36 · 692 阅读 · 0 评论 -
前向算法实现
typedef struct{ int N; /* 隐藏状态数目;Q={1,2,…,N} */ int M; /* 观察符号数目; V={1,2,…,M}*/ double **A; /* 状态转移矩阵A[1..N][1..N]. a[i][j] 是从t时刻状态i到t+1时刻状态j的转移概率 */ double **B; /* 混淆矩阵B[1..N][1..M]. b[j][k转载 2013-06-02 19:35:53 · 786 阅读 · 0 评论 -
POJ《A Knight's Journey》方法:DFS
题目大意:骑士遍历给定p*q棋盘,列是从'A'开始,找到一条字典序最小的遍历路径。// 236k 47ms#include #include using namespace std;typedef class {public: int row; char col;} location;bool visit['Z'+1][27];int row, col;int x,原创 2013-04-19 10:26:52 · 577 阅读 · 0 评论 -
POJ3461《Outplo》方法:KMP
题目大意:求p字符串在s字符串中出现的次数。解题思路:典型的KMP,但是要注意这里的nextval数组要多求一位,比如aka的nextval数组为-1,0,-1,1,从而在akakaka中找aka子串时,在s[3]时,可以与p[2]比较。如果只要求在源串中找子串的位置,nextval数组是不需要多求一位的。// 1276k 110ms#include #include using原创 2013-04-13 21:41:06 · 585 阅读 · 0 评论 -
POJ2513《Colored Sticks》方法:字典树+欧拉图+并查集
转自http://blog.csdn.net/lyy289065406/article/details/6647445题目大意:给定25W条木棒,木棒两个端点为表示颜色的字符串,比如blue, red,能否根据端点颜色相同这个条件,将这些木棒连接起来。解题思路:就是找一条欧拉图,充要条件是图是连同的,且有0或2个结点度数为奇数。居然用map将字符串映射到整数也超时,因为它是基于hash的,原创 2013-04-12 10:32:22 · 638 阅读 · 0 评论 -
POJ3253《Fence Repair》方法:优先队列
题目大意:需要切成20000块木块,每切一次的费用就等于该模板长度。解题思路:因此首先将待切木板排序,每次取2块最小的木板,比如有8, 5, 8三块木板,首先切21的木板,然后切5,再切8,21+5+8=34。反过来就是5, 8, 8,第一次5+8=13, 8,13,第二次8+13=21。和为13+21=34。将这些小块木板合起来的最小费用等于将大块木板分割的最小费用。// 480k 49原创 2013-04-09 10:27:25 · 716 阅读 · 0 评论 -
POJ3274《Gold Balanced Lineup》方法:哈希
题目大意:最多有10w个牛,每个牛有最多30个特征,比如特征 10,可以表示为二进制形式1010,现在要求出在一个连续区间,牛的每个特征数目相等时,连续区间的最大长度。解题思路:sum[i][j]表示从第1个到第i个牛,特征j出现的总数,即要求sum[a][0] - sum[b][0] = sum[a][1] - sum[b][1] = sum[a][k-1] - sum[b][k-1]。式子原创 2013-03-25 19:30:51 · 566 阅读 · 0 评论 -
POJ1002《487-3279》方法:sort
题目大意:给定一些用字符,连接符,数字组成的号码,将这些号码按照规定格式,最终都转换为数字格式。输出重复的号码和次数。解题思路:全存为数字后,快排,若某个号码出现多于2次则输出。// 620k 782ms#include #include #include #include using namespace std;void initCtoi(char *c){ for原创 2013-03-23 23:14:09 · 582 阅读 · 0 评论 -
POJ3349《Snowflake Snow Snowflakes》方法:哈希函数
题目大意:给定10W组数,每组数由6个数字组成,分别代表雪花的每一边长,现在需要找出是否有两个一样的雪花,即顺时针或逆时针的一组数要相同。解题思路:因为数据量过大,因此不能将每组数和其他10W组数比较,因此用到哈希函数,以每组数的和作为key,然后用除以prime 100003的余数作为下标值,存的还是这个数的序号,取质数作为除数是为了减小冲突。// 6200k 3625ms#inclu原创 2013-03-24 16:07:24 · 705 阅读 · 0 评论 -
POJ1804《Brainman》方法:归并排序找逆序数
题目跟POJ2299差不多,只不过数据集变小了,用冒泡排序也可以。// 204k 204ms#include using namespace std;const int inf = 1000001;int ans; // 逆序数void combine(int *a, int top, int mid, int end){ int len1 = mid-top+1; i原创 2013-03-22 13:10:10 · 620 阅读 · 0 评论 -
POJ2299《Ultra-QuickSort》方法:归并排序找逆序数
题目大意:求一个数的逆序数,比如54321的逆序数为4+3+2+1+0=10,逆序数 = 在只交换相邻两数的前提下,需要的交换次数。解题思路:因为这题数据量为50W,时间限制为7000ms,用冒泡排序找相邻交换次数肯定超时,因此用归并排序找相邻交换次数。之所以不用快速排序,是因为它不符合相邻元素交换的要求。// 3748k 2454ms#include using namespace原创 2013-03-22 13:02:56 · 648 阅读 · 0 评论 -
POJ3432《Count Squares》方法:哈希
题目大意:跟POJ2002一摸一样,就数据由1000变为2000,找正方形形。解题思路:已知: (x1,y1) (x2,y2) 则: x3=x1+(y1-y2) y3= y1-(x1-x2) x4=x2+(y1-y2) y4= y2-(x1-x2) 或 x3=x1-(y1-y2) y3= y1+(x1-x2) x4=x2-(原创 2013-04-05 10:52:30 · 707 阅读 · 0 评论 -
POJ2388《Who's in the Middle》方法:排序
题目大意:找10000个数中的中位数。解题思路:用O(nlogn)的排序算法,O(n^2)会超时,STL中的sort函数是对qsort的优化,时间复杂度O(nlogn)。//252k 47ms#include #include #include #include using namespace std;int main(){ int n; cin >> n; int原创 2013-03-21 10:22:36 · 586 阅读 · 0 评论 -
POJ2253《Frogger》方法:Floyd-Wallshall
将Floyd算法中求每对顶点间的最小距离,条件换成每对顶点间最长序列的最大跳数,所以要多加进去k。#include #include #include #include using namespace std;class coordinate {public: double x, y;} points[201];double path[201][201];int m原创 2013-02-28 10:36:15 · 692 阅读 · 0 评论 -
POJ3259《Wormholes》方法:Bellman-ford
农夫要回到原点,找一条负权环,注意输入有正权双向路径和负权单向路径。#include #include #include using namespace std;int all = 0; //有向边数int dis[501]; //源点到各点权值int N, M, W; // N点数,M正权双向边数,W负权单向边数class weight{public: int s原创 2013-02-27 10:57:55 · 312 阅读 · 0 评论 -
POJ1573《Robot Motion》方法:模拟
纯粹的模拟,无难度#include #include #include using namespace std;int main(){ int row, col, entry; char grid[12][12]; //freopen("temp.txt", "r", stdin); while (true) { memset(grid, 'O', sizeof(gr原创 2013-02-19 16:25:43 · 408 阅读 · 0 评论 -
POJ1018《Communication System》方法:枚举+剪枝
题目描述:题目很拗口,简言之就是,从n组中每组选取一对数,使得min{a1,a2...} / sum{b1,b2...}最大。方法:枚举,因为受到两个因素的影响,所以“固定带宽”,就是将所有对数以带宽a排序(价格是第二要素,id是第三要素),然后加入价格,遍历看是否能使结果最大。剪枝,1.第一层遍历只遍历第一个到第倒数n个数,因为剩下来的数如果小于n,则不满足n个数的题意。2.如果当前原创 2013-01-22 14:12:11 · 414 阅读 · 0 评论 -
POJ分类题
转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 最近AC题:2528 更新时间:2011.09.22 已AC题数:146初级题已在2011.06.30全部完成 部分解题报告添加新内容,除了原有的“大致题意”和“解题思路”外,新增“So转载 2013-01-20 14:36:43 · 573 阅读 · 0 评论 -
POJ2965《The Pilots Brothers' refrigerator》方法:DFS+Bit
题目描述:4*4冰箱格子,需将其全部打开,但是打开一个格子,它自己以及所在行和列都需要翻转,求最短次数及过程中打开的格子。方法:由于需要记录过程中的节点位置,所以BFS不太适合,因为可能不够,所以使用DFS来找到每次打开的路径。至于有大神使用的,一开始就遍历对"+"进行次行列翻转,从而剩下的"+"则为路径上的节点,一时还没弄清楚。#include #include #include原创 2013-01-20 20:13:26 · 379 阅读 · 0 评论 -
POJ1753《Flip Game》方法:BFS+Bit
题目描述:4*4黑白棋盘,点击一个棋子,则它的四周及本身变化颜色,求变为纯色的最短步数。方法:用BFS求最短步数,Bit存储状态,共有2^16=65536种状态。 #include #include #include #include using namespace std;bool visit[65536]; // 共有2^16个状态int dir[4][2]原创 2013-01-20 14:43:02 · 408 阅读 · 0 评论 -
POJ2774《Long Long Message》方法:后缀数组
就是求两个字符串的最长公共字符串,使用后缀数组,空间复杂度O(nlogn),花了2天时间来搞懂后缀数组,但是测试了很多数据没有发现什么错误,不知为什么这题在G++是RE,在C++下是WA,先贴代码,日后再分析。注意两个字符串之间要加分隔符#include #include #include using namespace std;#define maxasc 128#define原创 2013-02-01 22:51:06 · 380 阅读 · 0 评论 -
POJ2632《Crashing Robots》方法:模拟
题目大意:就是将坐标轴拟成二维矩阵的形式,E,N,W,S用0,1,2,3表示方便计算,左转右转后的方向用mod4来算。还有就是用编号作下标表示坐标,和用坐标作下标表示编号。更新一个点时,要将前一个清空。#include #include #include using namespace std;int main(){ //freopen("temp.txt", "r", std原创 2013-01-29 14:41:47 · 306 阅读 · 0 评论 -
POJ1008《Maya Calendar》
题目大意:水题,将一种日期表达方式转化为另一种,累加总天数即可求,同时也要考虑好匹配某一月名称的方法,这里采用累加字符串的ASCII码,因为C++中switch无法case字符串,只能是case常量值。#include #include #include using namespace std;int getMonth(char *month){ int num = 0; f原创 2013-01-27 16:36:55 · 354 阅读 · 0 评论 -
POJ1068《Parencodings》方法:模拟
题目大意:将一种括号表现形式转变为另一种,通过变为中间字符串000010101111的形式转化,easy。#include #include #include using namespace std;int main(){ //freopen("temp.txt", "r", stdin); int t, n; int p[21] = {0}; //P串,p[0]=0很重原创 2013-01-28 12:10:44 · 409 阅读 · 0 评论 -
POJ3239《Solution to the n Queens Puzzle》方法:构造公式法
题目大意:n(830时,传统方法不再使用。所以,网上有巧妙的构造公式方法:一、当n mod 6 != 2 或 n mod 6 != 3时:[2,4,6,8,...,n],[1,3,5,7,...,n-1] (n为偶数)[2,4,6,8,...,n-1],[1,3,5,7,...,n ] (n为奇数)二、当n mod 6 == 2 或 n mod 6 =原创 2013-01-26 10:36:10 · 775 阅读 · 0 评论 -
POJ3295《Tautology》方法:构造栈
题目大意:就是确定永真式p,q,r,s,t为逻辑变量,K,A,N,C,E为逻辑操作符,就是考虑逻辑变量所有情况,所有变量和操作符压入栈中,然后取出变量做逻辑运算,将结果再压回栈中,看最后结果是不是为真。#include #include #include #include using namespace std;int pp, qq, rr, ss, tt;stack s;原创 2013-01-25 10:21:28 · 455 阅读 · 0 评论