POJ
文章平均质量分 70
亚N程
这个作者很懒,什么都没留下…
展开
-
POJ:3670 Eating Together(动态规划)
题意:每次可以改变一个数字,要求使给定的数列变成单调递增或递减,求最小操作数思路:简单动规。设dp[i][j]表示以第i个数为最后一个数且数值为j时候的最优解,就递增时而言,dp[i][1]可以从dp[i-1][1]转移,dp[i][2]可以从dp[i-1][1]、dp[i-1][2]转移,dp[i][3]可以从dp[i-1][1]、dp[i-1][2]、dp[i-1][3]转移,当然还要考虑原创 2015-04-03 23:01:19 · 1037 阅读 · 0 评论 -
POJ:3320 Jessica's Reading Problem
watashi书上的例题,用了一个叫尺取法的东西,两个例题都是求最短区间的问题。主要是维护首尾两个指针i,j。当区间满足要求的时候,不断增大i以缩小区间长度来看是否能达到最优解,如果区间不满足要求,则增大j。这个题关于知识点的东西很难表示,用了map。当出现一个新的知识点,此时map中的元素等于出现的知识点时说明满足要求。当失去一个知识点使得map中的元素个数不等于出现的知识点时则不满足要求。原创 2014-01-27 23:52:09 · 726 阅读 · 0 评论 -
POJ:3061 Subsequence
问你一串数字中某几个连续数字和大于等于S,最少个数是多少。利用前缀和,构造有序性,再二分查找最少长度。O(nlogn)。#include #include #include #include #include #define ll long long#define INF 2139062143#define MAXN 100005using namespac原创 2014-01-27 12:57:10 · 620 阅读 · 0 评论 -
POJ:1088 滑雪
这道题之前在UVa写过,用的是递推,但是要求从小到大的顺序,比较麻烦。这次用了记忆化搜索。其实这也是个非常经典的记忆化搜索题。 #include#include#include#include#include#define MAXN 105using namespace std;int R,C,grid[MAXN][MAXN];int M[4][2]=原创 2013-12-14 19:03:25 · 562 阅读 · 0 评论 -
POJ:1922 Ride to School
想通了就会发现这是一道大水题。不管中间过程如何,Charley一定是最早到达的,而且是并列,所以只需要求里面出发时间非负最早到达的时间即可。看了disscuss才知道。。。唉。这个题还是说明思路要灵活,从另外的角度看问题。。 #include#include#include#include#includeusing namespace std;int main()原创 2013-11-14 07:54:19 · 896 阅读 · 0 评论 -
POJ:1273 Drainage Ditches(网络最大流模版题)
第一次做网络流的题目,比着白书敲了一个EK算法,然后AC了。最大流理解的还不够深刻,还得研究研究。注意有重边。 #include#include#include#include#include#define MAXN 205#define INF 2000000000using namespace std;int main(){ int m,n; wh原创 2013-11-08 20:45:55 · 648 阅读 · 0 评论 -
POJ:1423 Big Number
问你一个数的阶乘是几位数。首先,N的位数等于logN+1向下取整。那么N!的位数就等于log(N!)+1向下取整,即log1+log2+……+logN+1向下取整打表可以AC。与阶乘有关的还有一个斯特林公式,有空研究下。#include #include #include #include #include #define MAXN 10000000using na原创 2013-11-08 17:56:41 · 672 阅读 · 0 评论 -
POJ:2299 Ultra-QuickSort(归并排序/树状数组)
要移动元素的次数实质就是逆序对数。这个在入门经典上有详细解释,归并排序一改就ok了。这里我们首先应该明确一个问题,前后两段内部的元素位置并不影响两个分别来自前后两段元素的逆序性,简单点说,a来自前段,b来自后端,如果(a,b)是个逆序对,那无论a,b在其段内怎么移动,(a,b)仍是逆序对。所以这个问题的解法就是用前段的逆序对数加上后段的逆序对数,再加上合并之后的的逆序对数,很明显这原创 2013-08-06 13:49:44 · 688 阅读 · 0 评论 -
POJ:3617 Best Cow Line
一道简单贪心。我还是考虑不全面。比较原串首位第一个不相同的字母,然后决定删除的方向。注意不是只比较一个字母。如果只比较原串首尾第一个字母,如果两者相同就任意取的话,DCED这种样例是过不了的,即使过了DECD这个样例是过不了的。所以正确的思路是如果两者相同就比较下一对字母。。注意是下一对。另外每80个字符要换行。比较坑爹。。 #include #include #inc原创 2013-11-06 07:26:29 · 597 阅读 · 0 评论 -
POJ:1111 Image Perimeters
第一遍dfs八方向标记该物体,第二遍for循环遍历每个被标记对象统计它周围四方向“.“或者越界位置的个数。 #include#include#include#include#includeusing namespace std;char grid[30][30];int M[10][2]= {{1,0},{-1,0},{0,1},{0,-1},{1,1},{-1原创 2013-11-04 07:10:08 · 759 阅读 · 0 评论 -
POJ:2965 The Pilots Brothers' refrigerator(二进制枚举)
这个题用bfs搜索过不了了。于是上网学习了某位大神用位运算枚举的办法。。摘自discuss:首先应该明白两点:1 不论翻转执行的先后序列如何,结果都一样。2 每一个点(i,j)最多做一次翻转。(由1不难得到) 交C++反而比G++要快。。不可思议。。用0到2^16表示所有可能的翻转的位置,然后依次翻转看看是否得到全0即开的状态,如果可以则记录下最小值和这种该翻转情况。最后输原创 2013-11-03 13:03:45 · 611 阅读 · 0 评论 -
POJ:1753 Flip Game
网上说是枚举,我却用了BFS搜索的。看到discuss上说用位运算可以解决,代码很短,好神奇,有空研究下。。 #include#include#include#include#includeusing namespace std;struct State{ bool grid[6][6]; int step;};void Change(State &t原创 2013-11-01 22:21:16 · 588 阅读 · 0 评论 -
POJ:2240 Arbitrage(bellmanford判负环变形题)
跟bellmanford判负环是一样的,只不过这里是要求最大值,而且是乘积,如果最大乘积大于1则说明yes,否则为no。由于这里是求最长路,所以dist数组要初始化为最小即0。还有就是注意将源点初始化为1,我这里源点是0而不是1,这里WA了一次。。 #include#include#include#include#include#includeusing namesp原创 2013-10-21 22:00:26 · 794 阅读 · 0 评论 -
POJ:2481 Cows
这题个人感觉不错,乍一看是个区间覆盖问题,其实是用树状数组求逆序数。但是有些地方要注意。所谓stronger是指一个区间可以完全覆盖另一个区间,如果这俩区间完全相同是不算的。按x左边升序排序,如果x相同y要降序排序。在用树状数组的时候要注意了,假设区间为p[],我们这里是求p.y的逆序数,其实也要考虑p.x。假设当前区间的下标为i(i从1开始),那么p[i]前一个元素的下标为i-1原创 2013-11-11 11:13:06 · 711 阅读 · 0 评论 -
POJ:1469 COURSES(匈牙利算法模版题)
纯模版题,一点小错WA了两次。 #include #include #include #include #include #define MAXN 305using namespace std;int N,P,link[MAXN];bool vis[MAXN],gl[MAXN][MAXN];bool Match(int v){ for(int i=1; i<=N原创 2013-11-21 10:43:02 · 799 阅读 · 0 评论 -
POJ:2796 Feel Good(单调栈)
题意:给一个数组,计算某段区间的和乘以该区间最小值,要求该值最大并输出区间范围。思路:用一个单调栈,计算以某数为区间的最小值的区间左右范围。具体来说,如果栈顶为空则left[i]=1;如果非空,比较a[i]与栈顶元素的大小,如果a[i]小于栈顶则right[sk.top()]=i+1(我的区间表示是左闭右开)并弹出,如果相等则left[i]=left[sk.top()],如果大于则left[i原创 2015-03-11 17:28:46 · 486 阅读 · 0 评论 -
POJ:2528 Mayor's posters(未AC)
这是经典的线段树染色问题。用到了区间改值。这个题的难点在于离散化。普通的离散化是不行的。因为在线段树和这个题中数字代表的是一段区间,这样4和5是相邻的。而且普通的离散化每个数都是相邻的。如果有两个区间【1,6】,【10,20】,【1,20】。离散化以后就变成【1,2】【3,4】,【1,4】。很明显两个答案并不一样。这样,如果相邻两个点的差值大于1,则离散化的时候编号多加一。POJ的di原创 2014-03-21 19:15:14 · 605 阅读 · 0 评论 -
POJ:2556 Largest Rectangle in a Histogram
栈的应用。思路类似于之前做得一个题,L【i】,R【i】,H【i】分别表示长度为H【i】的长方形的左端点和右端点。显然最大面积等于max{H【i】*(R【i】-L【i】+1)}。H【i】已知,问题在于L【i】,R【i】怎么求。这里用那个题的思路就不行了。就左端点而言,这里需要求从当前位置i往左第一个长度小于H【i】的。这里可以用一个栈来维护。如果栈顶长度大于等于H【i】则L【i】即i,否原创 2014-03-21 08:24:55 · 662 阅读 · 0 评论 -
POJ:1679 The Unique MST(判断最小生成树是否唯一)
MST一道经典变形题目。问你MST是否唯一。MST的权是唯一的,但MST不一定唯一。MST不唯一的必要条件之一是无向网有相同权值的边。即,MST不唯一,无向网一定有相同权值的边,但是无向网有相同权值的边,MST不一定唯一。得到一个逆否命题,MST没有使用无向网中相同权值的边,那么MST一定唯一。如果MST使用了无向图中相同权值的边,那么依次去掉这些边,如果某次去掉之后得到MST原创 2013-10-12 17:50:15 · 2391 阅读 · 1 评论 -
POJ:2356 Find a multiple(鸽巢原理)
鸽巢原理。开始只是胡乱蒙了一个结论写的,居然AC了,后来百度发现竟然是鸽巢原理。http://blog.csdn.net/u011026968/article/details/11564841这个人写的很好,我摘抄一段。a1,a2,a3...am是正整数序列,至少存在整数k和r,1证明比较简单:Sk表示前k个数之和, (1)若Sk%m==0,前k个数就是m的倍数(2原创 2014-01-18 22:07:14 · 1103 阅读 · 0 评论 -
POJ:2886 Who Gets the Most Candies?
线段树模拟约瑟夫环+反素数。 #include #include #include #include #include #include #include #include #include #include #define ll long long#define INF 2139062143#define inf -2139062144#define MOD原创 2014-03-13 19:08:49 · 588 阅读 · 0 评论 -
POJ:3321 Apple Tree
可以用树状数组实现,每次C就是改值,每次Q就是查询。但是由于题目是给的树结构,而树状数组求和是线性区间,所以需要将题目中的树节点编号,并对每个结点划分它的子树区间以便求和。用dfs后序遍历整棵树标记序号,然后取子树中最小结点为左端点,自身编号是右端点。之后用树状数组就可以了。用vector会超时,自己写了个数组的邻接表居然AC了。#include #include #include原创 2014-03-14 23:13:10 · 563 阅读 · 0 评论 -
POJ:1077 Eight(双向BFS+判重)
HDU也有这道题但是数据比较强,我的代码过不了(内存超限了。。)。只能过POJ的。。 这是某大神的。。http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html 我的代码。。用了stl这是速度慢的一个重要原因。。#include#include#include#include#includ原创 2013-10-28 22:06:15 · 695 阅读 · 0 评论 -
POJ:2263 Heavy Cargo
这个题是要求起点到终点的最小边的最大值。注意各种数组变量的初始化。首次尝试邻接矩阵做Bellmanford算法。。 #include#include#include#include#include#include#define MAXN 205using namespace std;int main(){ int n,m,kase=0; while(c原创 2013-10-25 19:52:12 · 628 阅读 · 0 评论 -
POJ:1861 Network
题意:给你m个可以连接的集线器点以及线的长度,输出最长的单线,连通所有集线器所用线数目以及每条线对应的点。思路:很裸的最小生成树。果然是special judge,连样例都不一样我都不敢交了。。#include #include #include #include #include #define MAXN 1005using namespace std;原创 2013-10-05 21:45:42 · 785 阅读 · 0 评论 -
POJ:1251 Jungle Roads
题意:给你一些村庄和到相连村庄的距离,让你求最小连通所有村庄的路径长度。思路:最小生成树。我在这里用map建立了一个村庄名到连续数字的映射,由于映射对应关系,这样就需要连续数字从1开始。#include #include #include #include #include #include #define MAXN 1000using namespace原创 2013-10-05 22:19:33 · 655 阅读 · 0 评论 -
POJ:2031 Building a Space Station
题意:给你一些空间单间的三维坐标及半径,问你连通所有单间所需走廊的最小长度。思路:最小生成树。注意求两单间之间的距离要减去两个单间的半径,当然如果距离小于它们半径的话就说明两单间是接触的。用c++交要用%lf,g++要用%f,否则会WA。 #include #include #include #include #include #define EPS 1e-9using原创 2013-10-06 13:58:23 · 545 阅读 · 0 评论 -
POJ:1979 Red and Black
DFS经典题目。 DFS是会无限搜索下去的,但它求得的解不是最优的,这点与BFS区别。 #include #include #include #include #include using namespace std;char grid[25][25];int W,H;int ans;bool vis[25][25];bool Judge(int i,int j原创 2013-09-20 21:20:32 · 844 阅读 · 0 评论 -
POJ:1287 Networking
题意:给你一些地点以及之间的长度,问你连接所有地点的最小长度。思路:纯裸最小生成树。 #include #include #include #include #include #define MAXN 100005using namespace std;struct Edge{ int a,b,weight;};bool cmp(Edge x,Edge y)原创 2013-10-06 12:40:54 · 715 阅读 · 0 评论 -
POJ:1562 Oil Deposits
经典的DFS。八连块问题,UVa上做过原题。注意下有关字符串的输入问题,scanf(“%s”,s)不会读入换行。 #include #include #include #include #include using namespace std;int N,M;char grid[105][105];bool vis[105][105];void dfs(int i原创 2013-09-19 21:43:36 · 676 阅读 · 0 评论 -
POJ:1659 Frogs' Neighborhood (Havel-Hakimi定理)
序列是可图的:一个非负整数组成的有限序列如果是某个无向图的度序列,则称该序列是可图的。判定一个序列是否是可图的,有以下Havel-Hakimi定理。 Havel—Hakimi定理:由非负数组成的非增序列s:d1,d2,···,dn(n>=2,d1>=1)是可图的,当仅当序列s1:d2-1,d3-1,···,dd1+1 -1,dd1+2,····,dn是可图的。序列s1中有n-1原创 2013-09-18 22:15:10 · 788 阅读 · 0 评论 -
POJ: 1128 Frame Stacking (全拓扑序列)
题意:给一幅图是几张图叠起来以后的效果,问这几张图是按照什么顺序叠起来的。思路:由于每张图四条边都至少能看见一个字符,由此可以推出该图片的大小,在该图片边界上出现的图片就是覆盖它的图片,由此建图,输出全拓扑序列。1Y。可能细节比较多一点。#include #include #include #include #include #include #include原创 2013-10-02 20:21:22 · 638 阅读 · 0 评论 -
POJ:3687 Labeling Balls (反向建图+拓扑排序+优先队列)
题意:给定n个球和m条球与球之间的轻重关系,要求输出每个球的重量,无解则输出-1.trick:1.有重边。 2.要求输出每个球的重量而不是从轻到重每个球的标签。 3.要求输出编号小的球尽量轻的情况,而不是字典序最小的情况。 PS:字典序最小是指越靠前的位置数越小,而此题的要求是数越小的位置越靠前。原创 2013-09-30 22:36:56 · 989 阅读 · 0 评论 -
POJ:2585 Window Pains(拓扑排序)
题意:给你屏幕上窗口的覆盖关系,问你能否通过初始的9个窗口覆盖得到。思路:通过拓扑排序判断是否成环。一想到这就很简单了。因为最后输出字符串写错了。。狂WA。。囧。。 #include #include #include#include#include#include#includeusing namespace std;int main(){ string原创 2013-09-30 19:11:54 · 905 阅读 · 0 评论 -
POJ:3974 Palindrome (Manacher算法)
Manacher算法:在O(n)的时间内求得最长回文子串。 在这里简单说一下这个算法。首先在原字符串s之间加入一个特殊字符(原串中没有的)#作为标记构造一个新串ss。这样做可以其实可以把最长回文子串是奇数偶数两种情况合并为只有奇数一种情况。然后,开一个数组p[]来保存以每个字符为中心的最长回文子串的长度。 下面进入关键的部分。关于求以字符s[i]为中心的最长回原创 2013-09-07 21:18:26 · 776 阅读 · 0 评论 -
POJ:1465 Multiple(bfs+剪枝)
题意:给你一个数N,以及m个小于10的十进制数字,要你找到N的一个最小正整数倍的数,它的每位数字都是由这m个数字中的数字组成。思路:bfs+剪枝。需要从高位向低位拓展,其实也就是按照我们手算的过程。这里有一个很重要的剪枝,如果得到了一个之前得到过的余数,那么是没有必要再进入队列的,因为它只要输出最小的正整数倍数。这样有了剪枝就使得队列有为空的可能,如果最后为空都没有找到答案自然输出0。由于答案原创 2013-10-06 12:05:30 · 881 阅读 · 0 评论 -
POJ:2421 Constructing Roads
与这个题基本一样。http://blog.csdn.net/kkkwjx/article/details/12316701 最小生成树的题要搞清楚点的个数,边的个数,不要混了。 #include #include #include #include #include #define MAXN 10005using namespace std;struct Edge原创 2013-10-06 13:10:13 · 701 阅读 · 0 评论 -
POJ:1789 Truck History
想到了最小生成树就很简单了。注意输出后面有个“."。 #include #include #include #include #define MAXN 2005using namespace std;int Match(char a[],char b[]){ int n=0,l=strlen(a); for(int i=0; i<l; ++i)原创 2013-10-09 07:38:50 · 608 阅读 · 0 评论 -
POJ:1270 Following Orders (全拓扑排序)
题意:第一行给出变量,第二行给出约束关系,要求按字典序输出全部拓扑序列思路:全拓扑排序。输入比较恶心,处理一下就可以了。看见discuss上有人用dfs和全排列AC掉了,不得不佩服一下,这道题被我活生生做成了模版题。#include #include #include #include #include #include #include usin原创 2013-10-02 19:22:25 · 1022 阅读 · 0 评论 -
POJ:3259 Wormholes(SPFA判断负环)
这个题最坑爹的地方在于有重边,因此有邻接矩阵比较方便。所以无向图的时候要这样if(w而无向图 gl[u][v]=-w;#include#include#include#include#include#includeusing namespace std;int main(){ int T; scanf("%d",&T); while(T原创 2013-10-21 10:19:57 · 694 阅读 · 0 评论