Poj
文章平均质量分 53
Ares_晓越
这个作者很懒,什么都没留下…
展开
-
Poj 1860 Currency Exchange
题目大意有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加货币的交换是可以重复多次的,所以我们需要找出是否存在正权回路,且最后得到的s金额是增加的怎么找正权回路呢?(正权回路:在这一回原创 2012-01-14 16:14:32 · 1161 阅读 · 1 评论 -
Poj 3321 Apple Tree
题目大意:给定一棵树(题目中默认节点 1 为根),树的节点上可能有苹果,也可能没有。需要查询某个节点及其子节点上的苹果数量之和,并且支持节点上长苹果或苹果摘(将节点的值改为1或者改为0)。思路:要用到树状数组来统计某个范围内元素的和,可是根据当前节点的编号,是没办法使用树状数组的。对于节点 i,我们必须让节点i的所有子节点的编号和 i 连续。对此我们需要做一些预处理。先建树,用DFS对树进行后原创 2012-01-20 20:03:32 · 384 阅读 · 0 评论 -
Poj 1195 Mobile phones
题目大意:给定一个n*n的矩阵,要求对这个矩阵做以下四种动态操作。0 S 将S*S的矩阵元素的值都赋值为01 X Y A 将A添加到矩阵的(X,Y)上2 L B R T 查询矩阵中的元素值(X,Y)的和,其中L3 表示操作结束思路:二维树状数组的应用。//二维数组#include using namespace std;#include const int maxn原创 2012-01-20 13:11:14 · 400 阅读 · 0 评论 -
树状数组模板
树状数组是一个查询和修改复杂度都为log(n)的数据结构,将树状数组看成一种数据结构,对于一个数组,如果有多次操作,每次的操作有两种:1、修改数组中某一元素的值,2、求和,求数组元素a[1]+a[2]+…a[num]的和,这是树状数组最基本的应用了。//二维树状数组const int maxn = 1050;int c[maxn][maxn];int n;int lowbit(int原创 2012-01-19 15:26:39 · 1668 阅读 · 1 评论 -
Poj 2828 Buy Tickets
题目大意:有N个人排队,给出各个人想插队的位置和标识,要求输出最后的序列。思路:利用线段树,从最后一个人往前插,这样position的意义就表示前面有多少个空位,线段树上每个节点中存储的是区间有多少空位。#include using namespace std;#include const int MAXN = 200010;struct tree { int left; in原创 2012-01-19 14:39:42 · 434 阅读 · 0 评论 -
Poj 2528 Mayor's posters
题目大意:多位候选人要在墙上贴海报,海报可以相互重叠,问贴完了以后还有多少海报可以看见。思路:经典的线段树问题,同时需要离散化坐标点。#include #include #include #include using namespace std;const int MAXN = 10000001;//节点数量const int DISCRETE_MAXN = 10010*2原创 2012-01-19 14:26:42 · 337 阅读 · 0 评论 -
Poj 2516 Minimum Cost
题意大意:有N个客户,M个仓库,和K种货物。已知每个客户需要每种货物的数量,每个仓库存储每种货物的数量,每个仓库运输各种货物去各个客户的单位费用。判断所有的仓库能否满足所有客户的需求,如果可以,求出最少的运输总费用。思路:最小费用最大流,这道题我是直接用了模板。#includeusing namespace std;#include const int inf = 99999999;原创 2012-01-19 14:21:23 · 494 阅读 · 0 评论 -
Poj 1080 Human Gene Functions
题目大意:已知ATCG四种不同的碱基之间的相似度。现在给出两个碱基序列,可以在两个串间插入‘-’即空白,求两串的最大相似度。思路:有点类似于LCS,状态转移方程为dp[i][j]=getMax(dp[(i-1)][j-1]+table[str1[i]][str2[j]],dp[(i-1)][j]+table[str1[i]][4],dp[i][j-1]+table[4][str2[j]])原创 2012-01-19 14:16:23 · 353 阅读 · 0 评论 -
Poj 2533 Longest Ordered Subsequence
题目大意:给定一个序列,求该序列的最长上升子序列的长度。思路:和1887一样,都是最长单调子序列的题目。尝试了两种做法,一个是和1887一样的做法,复杂度是O(n*n),还有一种是利用二分+栈,复杂度可优化为O(n*logn)。#include int data[1010];int dp[1010];int main(){ int i,j,n,m; scanf("%d",&n)原创 2012-01-18 13:34:56 · 348 阅读 · 0 评论 -
Poj 1887 Testing the CATCHER
题目大意:求给定数列的最长不升子序列。思路:比较水的DP,数组data存储给定的数列,dp[i]表示以data[i]结尾的最长不升子序列的长度。状态转移方程为if (data[j]>=data[i]&&dp[j]>=dp[i])dp[i]=dp[j]+1;(0#include int data[5000];int dp[5000];int main(){ int t,i,j,原创 2012-01-18 13:27:41 · 488 阅读 · 0 评论 -
Poj 2192 Zipper
题目大意:给出三个字符串,要求判断能否在保持字符串1和字符串2原有的字符顺序的前提下,将字符串1和字符串2连接成字符串3。思路:DP,定义一个二维数组dp[][],dp[i][j]表示str1的前i个字符能否和str2的前j个字符一起组成str的前i+j个字符。另外i=0或者j=0时表示空串,在初始化dp的时候需要注意。可以证明:当dp[i-1][j](dp[i][j]上面一格)和dp[i][原创 2012-01-17 22:30:51 · 393 阅读 · 0 评论 -
RMQ代码
RMQ,即是区间最值查询,对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j主要方法:朴素(即搜索),复杂度为O(n)线段树,复杂度较低,适用范围也比较广,但是实现复杂度较高。ST算法,以求最大值为例,设d[i,j]表示[i,i+2^j-1]这个区间内的最大值,那么在询问到[a,b]区间的最大值时答案就是max(d[a,k], d[b-2^k+1,k]),其中k是满足2原创 2012-01-19 16:33:53 · 981 阅读 · 0 评论 -
Poj 2481 Cows
题意大意:FJ有n头牛(编号为1~n),每一头牛都有一个测验值(S,E),对于牛i和牛j来说,如果它们的测验值满足下面的条件则表示牛i比牛j强壮:Si Ej - Sj。现在已知每一头牛的测验值,要求输出每头牛有几头牛比其强壮。思路:首先将S[i]降序排序,如果相等则按E[i]的升序,根据排序后的顺序往每头牛的S位置加1。如果遇到完全重合的数据,则不需要重新进行求和计算,只需把前面的值赋值给它原创 2012-01-20 20:46:33 · 1635 阅读 · 0 评论 -
Poj 1703 Find them, Catch them
题目大意:警察抓获N个罪犯,这些罪犯只可能属于两个团伙中的其中一个,现在给出M个条件(D a b表示a和b不在同一团伙),对于每一个询问(A a b)输出a,b属于同一团伙或者不是属于同一团伙或者不能确定。思路:并查集的应用。普通并查集相关的题目都是给出属于同一集合的元素,但是这道题是给出了属于不同集合的元素,可以维护一个opposite数组,如果x和y不属于同一集合,则将opposite[x原创 2012-01-20 22:42:24 · 458 阅读 · 0 评论 -
Poj 3411 Paid Roads
题目大意是:给定一个N和M,N代表城市数目(城市以1-N命名),其中有M条边连接这些城市,城市之间可能有重边。接下来有M行。每行有5个输入,分别为ai,bi,ci,pi和ri。ai表示第i条边的起始城市,bi表示第i条边的末尾城市。经过每条边都需要付钱,有两种付钱方式,付钱数分别为pi和ri,当且仅当ci这个城市之前有经过,才可以用ri这种付钱方式。然后要求找出一条付钱数最少的从城市1到城市N的路原创 2012-01-21 10:19:31 · 663 阅读 · 0 评论 -
Poj 1088 滑雪
题目大意:Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 8原创 2012-01-21 11:07:33 · 996 阅读 · 0 评论 -
Poj 1579 Function Run Fun
题目大意:求一个递归函数w(a,b,c)的值.w(a,b,c)如下定义:若a 若 a > 20 或 b > 20 或 c > 20, 那么 w(a, b, c)=w(20, 20, 20) 若a 对其余情况,w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) 思路:一道记忆化搜索的水题,通过这道原创 2012-01-21 10:55:41 · 426 阅读 · 0 评论 -
Poj 1724 ROADS
题目大意:给定一个最大费用,要求在费用容许情况下,求有源点到终点的最短距离。思路:其实就是求单源最短路径,但是加了费用限制。求最短距离的实质就是贪心,在这里可以使用优先队列+BFS,让到达某个点所花的费用总和小于给定的费用的所有顶点都进队列,每次再让距离最小的出队列,如果出队列的是终点则此时的最小距离就是最费用的范围内的最短距离。#include using namespace st原创 2012-01-21 10:28:46 · 404 阅读 · 0 评论 -
Poj 2524 Ubiquitous Religions
题目大意:输入n和m,n代表一共有n个学生,m代表接下来要输入m行,每行有两个数字表示这两个学生信奉同一个宗教,要求输出这n个人的信教一共有多少种。思路:典型的并查集应用,统计宗教个数的时候借用了STL中的map。#include using namespace std;#include #include #include // Model 1const int MAXSIZE原创 2012-01-20 23:28:00 · 414 阅读 · 0 评论 -
Poj 2492 A Bug's Life
题目大意:输入一个数t,表示测试组数。然后每组第一行两个数字n,m,n表示有n只昆虫,编号从1—n,m表示下面要输入m行交配情况,每行两个整数,表示这两个编号的昆虫为异性,要交配。要求统计交配过程中是否出现冲突,即是否有两个同性的昆虫发生交配。思路:并查集,和1703几乎一样的思路。#include using namespace std;#include #include //原创 2012-01-20 23:18:50 · 745 阅读 · 0 评论 -
Poj 3264 Balanced Lineup
题目大意:有一排牛,给定每头牛的高度,然后有一系列的询问,即给出i,j,要求输出第i个牛和第j个牛之间的最高的牛和最矮的牛之间高度差值。思路:典型的区间最值查询,获取最大值和最小值后相减即可。#include #include int n,q;#define MAXN 50010int dp_max[MAXN][20];int dp_min[MAXN][20];int num[原创 2012-01-20 20:52:00 · 453 阅读 · 0 评论 -
Poj 2155 Matrix
二维树状数组的应用,直接贴代码了。#include #include #define maxn 1024int c[maxn][maxn];int n;int lowbit(int x) { return x&(-x);}//设原始矩阵为matrix,将matrix[x][y]加上val对c矩阵所做的修改void add(int x, int y, int val) { i原创 2012-01-20 20:17:24 · 421 阅读 · 0 评论 -
线段树实现区间最值查询代码
上一篇是用ST算法实现区间最值查询,线段树也可以实现相应的功能。其实在处理大量数据的时候,线段树的适用范围更加广泛,不仅是最值查询,任何关于区间问题的题目都可以利用线段树解决。#includeusing namespace std;#define MAXN 100#define MAXIND 256 //线段树节点个数//构建线段树,目的:得到M数组.void initiali原创 2012-01-20 12:39:05 · 801 阅读 · 0 评论 -
Poj 2948 Martian Mining
题意大意:一个row*col的矩阵,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是多少。最北边有bloggium的收集站,最西边有 yeyenum 的收集站。现在要在这些格子上面安装向北或者向西的传送带(每个格子自能装一种)。问最多能采到多少矿。思路:DP,状态转移方程为dp[i][j]=max_num(dp[i][j-1]+bloggium[i][j],原创 2012-01-22 14:14:23 · 1051 阅读 · 0 评论 -
Poj 1191 棋盘分割
题目大意:将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行)原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。均方差 ,其中平均值 ,xi为第原创 2012-01-22 13:49:16 · 626 阅读 · 0 评论 -
Poj 3280 Cheapest Palindrome
题目大意:长度为M的字符串,可以增加或删除字符,使其构成回文,增加或删除不同的字符有不同的花费,求最小花费。思路:其实dp很难逃出3种思路:1、一维线性dp:每次考虑i时,选择最优子问题要么在i-1,要么在1...i-1里;2、二维线性dp:考虑(i,j)子问题时,选择最优子问题要么在(i+1,j)、(i,j-1),要么在i3、树形dp:考虑i节点最优时,选择子节点最优,一般融合了原创 2012-01-22 13:52:31 · 1005 阅读 · 0 评论 -
Poj 2029 Get Many Persimmon Trees
题目大意:一个H * W的大矩形,里面的某些格子种有树。现在要你找出一个h * w的小矩形,使得里面树的数量最多,并且输出最多有多少棵树。思路:网上看到不少人用DP,但我这道题是直接用了二维树状数组,枚举各个小矩阵的元素和然后找出其中最大的一个值。#include #include #include using namespace std;//二维树状数组const int ma原创 2012-01-22 13:57:26 · 628 阅读 · 0 评论 -
Poj 2777 Count Color
题目大意:给你一个长度为n的线段(n C a b c :将从a到b的线段涂上c色; P a b:询问从a到b的线段上有多少种颜色。思路:线段树的应用,另外还用到了一个线段树常用的思路——lazy。lazy顾名思义就是懒惰——这里是指在更新的时候,不必更新到每条元线段。#include using namespace std;#includ原创 2012-01-19 16:25:59 · 613 阅读 · 0 评论 -
字典树模板
字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高。字典树的应用:字符串的快速检索哈希最长公共前缀#include using namespace std;#define MAX 26 //字原创 2012-01-19 15:31:19 · 4507 阅读 · 1 评论 -
Poj 2513 Colored Sticks
题目大意:给出一些木棒,木棒数量不超过250000,每个木棒两端都涂有颜色,题目要求判断能否将所有木棒连成一条直线(颜色相同的木棒两端可以相连)。思路:将木棒的两端看成节点,木棒看成边,则可以抽象出一个无向图,题目转换为判断无向图里是否存在一条欧拉路径。可以先用字典树为各个出现的颜色建索引,同时统计各个颜色出现的次数,即各个节点的度。根据欧拉路径成立的前提条件:奇数度的节点只能有0个或者2个,原创 2012-01-15 21:44:15 · 581 阅读 · 0 评论 -
Poj 2488 A Knight's Journey
题目大意:马周游问题,输出字典序最小的周游路径。思路:比较水的题目,DFS,直接贴代码了。#include int data[9][9];int q,p,flag;int diry[8]={-2,-2,-1,-1, 1,1, 2,2};int dirx[8]={-1, 1,-2, 2,-2,2,-1,1};int datax[80];int datay[80];void原创 2012-01-15 22:24:03 · 323 阅读 · 0 评论 -
Poj 3278 Catch That Cow
题目大意:给定两个整数N和K,可以对N进行+1,-1,*2的操作,要求通过尽可能少的操作步骤使得N和K相等。思路:BFS,另外当N>K时,可以直接输出N-K。#include using namespace std;#include #include #include deque data;int sign[100010];int n,k;int BFS() { int原创 2012-01-16 22:53:34 · 384 阅读 · 0 评论 -
Poj 2251 Dungeon Master
题目大意:给出一个三维空间的地牢,要求输出从起点到终点所用的最短时间。每次移动耗时一分钟。思路:BFS,只是将二维空间扩展到三维空间,方向由原先的四个增加的六个 而已。#include using namespace std;#include #include int map[40][40][40];int flag[40][40][40];int l,r,c;int s1,原创 2012-01-16 22:39:56 · 384 阅读 · 0 评论 -
Poj 1321 棋盘问题
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。比较水的题目,直接深搜回溯就可以了。#include #include #include char map[10][10];int flag[10][10];int n,k,sign,c原创 2012-01-16 22:05:33 · 539 阅读 · 0 评论 -
Poj 3009 Curling 2.0
题目大意:给出一个w*h的地图,0代表空地,1代表障碍物,2代表起点,3代表终点。从起点出发每次可以移动多个方格,且只能朝不是障碍物的方向移动,直到遇到障碍物才停下来,此时障碍物也将消失。如果行动次数超过10就表示失败。否则记录达到终点时的行动次数,要求输出最小的行动次数。思路:分别朝四个可能的方向深搜。#include using namespace std;#include in原创 2012-01-16 22:00:41 · 444 阅读 · 0 评论 -
Poj 2253 Frogger
题目大意:找到从点1到点2的某一条路中最长边,使最长的这条边尽量短。思路:迪杰斯特拉算法的一个变形应用。通过这道题对于迪杰斯特拉算法有了更进一步的理解。通过数组建立的递推关系,这道题要求源点到达某一个端点的各条路径中最长边的最小值,可以通过暴力列举各条路径的最长边,然后从所有最长边中找到最小值(估计会TLE)。然而通过迪杰斯特拉算法修改其中的递推关系。如果dis[3]=5,dis[4]=8,端原创 2012-01-14 16:22:47 · 415 阅读 · 0 评论 -
Poj 1125 Stockbroker Grapevine
题目大意:股票经纪人喜欢招摇(为了赚钱),为了在最短的时间内,把一个谣言传播开来,请到你来为他写代码,题目会公布每个经纪人可以联系到的经纪人和所花的时间,你要做的是把一个谣言给一个经纪人,使得传播到最后一个人所花的时间最短。思路:Dijkstra算法的典型应用,对每个源点做一次Dijkstra找出最短路径。#include int data[120][120];int n;int d原创 2012-01-14 16:30:58 · 437 阅读 · 0 评论 -
Poj 2240 Arbitrage
题目大意:给出一些汇率,问是否能将手中的钱通过兑换,使最后再换回本币时数量增加。思路:bellman算法判断是否存在环,如果存在一个从源点可达的权为负的回路,则问题无解,否则算法将产生最短路径及其权值。#include using namespace std;#include #include int n;map index;double data[50][50];do原创 2012-01-14 16:39:50 · 326 阅读 · 0 评论 -
Poj 3041 Asteroids
题目大意:给你一个N*N的矩阵,有一些格子里有小行星,现在Bessie有一些威力很大的炮弹,每一次射击都能够消灭掉矩阵中一行或一列的小行星,但是炮弹很贵,问你需要消灭掉所有小行星所需的最小炮弹数目。思路:最小点覆盖的问题,将矩阵中每一个行看成集合A中的一个点,每一列看成集合B中的点如果第i行第j列有小行星则将Ai和Bj连一条边。题目要求的就是次二分图的最小点覆盖问题,在二分图中,最小点覆盖原创 2012-01-15 17:36:35 · 446 阅读 · 0 评论 -
Poj 3020 Antenna Placement
题目大意:给定一个坐标图,图中每在一个点上覆盖就可在覆盖它上下左右4个点中任一个,问最少放几个。思路:把每一个点都和与之相邻的4个点连边,就构成了一个二分图。利用匈牙利算法,最后输出的时候需要注意的是这里的点是所有可以放的点的两倍,而匹配数也是正常匹配数的二倍(A到B连了,B到A也连了),所以输出的时候应该先将匹配数除以2。#include using namespace std;原创 2012-01-15 18:32:03 · 722 阅读 · 0 评论