- 博客(135)
- 收藏
- 关注
原创 POJ初级解题记录
初级:一.基本算法: (1)枚举. (poj1018,poj1753,poj2965)(2)贪心(poj1328,poj2109,poj2586)(3)递归和分治法. (4)递推. (5)构造法.(poj3295,poj3239)(6.1)模拟法.(poj1008,poj1068,poj2632,poj1573,poj2993,poj2996,poj3087)
2013-08-25 22:33:59
437
原创 24点
写个24点不难,把括号括的没问题(没有多余的括号)还是要花点心思。这个动态规划的实现,免去了递归求解的很多重复计算。#include #include #include #include #include #include #include #include using namespace std;#define N 4#define NUM 16s
2013-10-08 18:40:07
246
原创 数组合并的面试题
Q:数组a[0,mid-1] 和 a[mid,num-1],都分别有序。将其merge成有序数组a[0,num-1],要求空间复杂度O(1)。数组al一共有num个元素。前mid个元素和后num-mid个元素均是有序,要求对整个数组排序。A: 这题我用到了两个算法 1 O(N)复杂的的顺序选择算法,即O(N)时间内找出无序数组中第k小的数。 2 字符串翻转算
2013-09-17 14:37:20
286
原创 POJ1129 Channel Allocation
四色问题的搜索。比较简单。#include #include #include using namespace std;struct Node{ int color; int adj[25]; int adj_num;};Node nodes[26];int n;int max_color;int visit[27];int main(){ while
2013-09-04 18:52:03
351
原创 POJ2676 Sudoku
数独。逻辑比较简单,不应该WA的,不知为何。#include #include #include using namespace std;char data[10][10];bool exist_row[9][10];bool exist_col[9][10];bool exist_square[3][3][10];bool dfs(int i,int j){ i
2013-09-04 15:17:25
324
原创 POJ1011 Sticks
DFS+剪枝。4个剪枝条件,缺一个都过不了。1 如果要组合成的棒子长度不能整除总长度,则继续组合下一个长度。if(sum_len%max_len != 0) continue;2 对棒子的长度降序排列,先搜索长的,短的放后面方面凑数。sort(len,len+n,cmp);3 对于搜索过的重复长度的棒子,跳过。4* 在从0开始组合新棒子的时候,如果第一个棒子没办
2013-09-04 13:52:41
489
原创 POJ2362 Square
DFS。等同于把长度数组划分成和相等的4份。#include #include using namespace std;int n;int len[20];bool visit[20];int sum;int side;bool dfs(int cur,int num, int cur_len){ if(num == 3) return true; f
2013-09-03 22:36:11
278
原创 POJ1459 Power Network
求最大流问题。用BFS搜索增广路径的Ford-Fulkerson算法做。多源多汇问题,增加一个超级源和一个超级汇。#include #include #include #include #include using namespace std;int n,np,nc,m;int s,t;int f[102][102];int c[102][102];b
2013-09-03 15:11:51
303
原创 POJ3020 Antenna Placement
转化成求最小路径覆盖。根据公式,有向图最小路径覆盖 = N - 最大二分匹配无向图最小路径覆盖 = N - 最大二分匹配/2本题两个城市家之间应属无向图。一个城市看做一个节点,V1为所有节点,V2为所有节点的克隆。|V1|=|V2|=N。求出V1和V2之间最大二分匹配,代入公式即可。#include #include #include using namesp
2013-09-02 19:54:02
340
原创 POJ3041 Asteroids
这题需要转换成最小点覆盖,再等同于寻找二分图最大匹配。思路的转换是难点,匈牙利算法本身比较直白简洁。所有行号作为V1点集,列号作为V2点集。障碍物看做链接V1和V2的边。#include #include using namespace std;int N,K;bool visit[501];bool graph[501][501];int link[501];
2013-09-02 16:52:52
247
原创 POJ3026 Borg Maze
怒了! getchar()竟然会WA。真是无语了!!!死都检查不出来逻辑哪儿错了。BFS+Prim。#include #include #include #include #include #include #include #include using namespace std;struct Point{ int i; int j; Point(int
2013-09-01 17:03:20
314
原创 POJ1789 Truck History
最小生成树。prim算法,因为是全相连的图,所以用O(V^2)的算法最快。。POJ怎么又不能用STL的accumulate算法了。。#include #include #include #include #include using namespace std;int n;int w[2000][2000];int D[2000];string V[2000]
2013-08-31 22:17:42
265
原创 POJ1125 Stockbroker Grapevine
简单的Floyd算法的应用。#include #include using namespace std;int n;int D[101][101];void floyd(){ for(int k=1;k<=n;++k) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) D[i][j] = min(D[i][j]
2013-08-30 19:28:52
312
原创 POJ 2240 Arbitrage
这题是1860和3259的一个结合,用bellman算法做。使用1860中的逆向bellman求最大路径的思想。因为没有指定当前货币,所以像3259中一样初始化的时候把所有的货币量初始化为1。也可以初始化为其他值。松弛的时候和最小路径相反,更新权值为较大值。这样经过N-1次松弛后,遍历所有边,若还可以更新权值,则说明图中存在正环(即可无限增大的环),于是返回Yes。#inclu
2013-08-30 18:53:11
294
原创 POJ2253 Frogger
这题算是简单的Floyd算法的应用。注意松弛条件的设定。D[i][j] = min(D[i][j], max(D[i][k],D[k][j]));这个松弛对于i到j的路径, 要么不包含k那就是D[i][j]。要么包含k,就是i->k和k->j的一个结合,这里不能用加去结合,而是取其较大的作为最终权值。因为这题的权值不是累加而是取路径上相邻点的距离的最大值作为最后权值。时间复杂度
2013-08-30 15:16:25
309
原创 POJ1062 昂贵的婚礼
这提要把我弄崩溃了!我还是用bellman做的。逻辑上怎么看都没错,尼玛就是WA。我一直怀疑担心的整型问题始终不愿相信。一怒之下直接把所有int换成了__int64。这尼玛果断AC了。不能理解啊!!!人世间最痛苦的事莫过于WA了。#include #include #include #include using namespace std;#define
2013-08-29 22:59:26
289
原创 POJ3259 Wormholes
也是bellman算法的一个应用。M为双向正边。W为单向负权值边。总的边数= 2M+W。不需要求节点间最短路径,只需要求是否该图含有负的环路。所以初始化只需将所有节点置为最大值。不需要指定一个源点并初始化为0。这里也并没有源点。如有负环则返回YES。#include #include using namespace std;struct Edge{ int A
2013-08-29 18:19:33
295
原创 POJ1860 Currency Exchange
bellman-ford算法的变形。传统bellman是求最短路径,这里变形为求最长路径。松弛结束后,遍历各边,如还有可松弛的边,则说明存在正向环,可无限增长,如此则解为YES。#include using namespace std;struct Edge{ int A; int B; double r; double c;};int N,M;int S
2013-08-29 16:11:31
285
原创 POJ3122 Pie
这题也是二分穷举的思路。上下界调整不能mid+1或mid-1了,这样会损失精度。因为不是整型。还有就是浮点数的相等比较不能像整型那样用==,还是设置一个逼近区间比较好。如while(high-low>1e-5)#include #include #include using namespace std;#define PI 3.14159265359i
2013-08-28 22:28:04
287
原创 POJ3258 River Hopscotch
和3273类似,二分穷举。下界为最短跳跃距离,上界为最长跳跃距离。二分搜索,以其中值为答案,反推出所移除的石头数为k,若k反之k>M说明跳跃距离太大移除了过多的石头。以此收缩上下界。若k==M,则此时mid可能是解也可能不是,需要继续上移下界,看有无更优解。最终得到的解可能是正解,也可能是正解+1。if(valid(low)) cout<<low<<endl; els
2013-08-28 21:21:10
368
原创 POJ3273 Monthly Expense
数组分割成M段,要求每段之和 的最大值最小。二分查找划分。N个元素划分成N段,其最大值为最大元素,此为下界。N个元素划分成1段,最大值为所有元素之和,此为上界。二分每次取其中值,进行划分,如划分超过M段,则中值太小,下界上移。如划分小于或者等于M段,则中值过大,上界下移。#include #include #include using namespace std;
2013-08-28 16:36:30
270
原创 POJ2002 Squares
真不明白怎么就不能用unordered_set了,只能自己写hash。我就用set尝试了下,3485ms。。3500ms的上限。用set应该比自己写的二分搜索要慢,但是省事儿。后面再更新个hash。#include #include #include #include using namespace std;class cmp{public: bool operator
2013-08-27 22:14:53
314
原创 POJ1840 Eqs
分成两部分,先打表 所有a1x1^3+a2x2^3可能出现的值。再遍历所有a3x3^3+a4x4^3+a5x5^3可能取值。用map会超时。哎。用数组。#include #include #include #include using namespace std;#define N 25000001int a1,a2,a3,a4,a5;short _map[N];in
2013-08-27 20:22:09
297
原创 POJ2115 C Looooops
所有知识点都在《算法导论》数论一部分可以找到。扩展欧几里得算法求解模线性方程。ax=b(mod n)转化到这题就是求解方程Cx = (B-A) (mod 2^k)自省:判断a不能被b整除用 a%b!=0 不能用a%b>0。#include #include #include #include using namespace std;__int64 A,B,C
2013-08-27 19:35:25
324
原创 POJ1845 Sumdiv
这题有点烦躁。#include #include #include #include #include using namespace std;#define MOD 9901int p[10000];int k[10000];int t=0;int A,B;__int64 power(__int64 a,__int64 n){ __int64 res
2013-08-26 23:32:30
271
原创 POJ3292 Semi-prime H-numbers
这题没什么意思。但是注意如果对每个测试用例都遍历数组计算结果会超时。用备忘录循环一次记录每个h值得结果。#include #include #include #include #include using namespace std;#define L 1000010int h;int prime[L];void process(){ cout<<h<<"
2013-08-26 19:06:29
277
原创 POJ2635 The Embarrassed Cryptographer
这题考察了素数打表,大数求模。刚开始TLE了,不能理解,后来突然发现can_mod函数string参数忘记传引用了,当然会超时了。。有个小优化if(res>100000000) res = res%t;可以减少模运算次数。不然还是会TLE。#include #include #include #include #include using namespa
2013-08-26 16:43:23
273
原创 POJ2305 Basic remains
大数求模。参照除法笔算的方式。蛮简单的,对于被除数p和除数m,按照除法的计算方法,从左到右每次读入一位,mod m,得到的余数继续读入后面的位。#include #include #include #include #include using namespace std;int b;string p,m;void process(){ int divisor = 0
2013-08-26 14:24:28
287
原创 POJ1012 Joseph
约瑟夫环问题。特化为前K个好人,后K个坏人。求前K轮杀掉所有K个坏人的最小M。编号从0-N-1。共N个节点。最关键的递推式F[i] (i从1开始) 表示第i轮杀掉的人的序数。F[i] = (F[i-1]+m-1)%(N-i+1)。这个F[i]是当前这轮的序数。杀掉之后,后面如果排有人则全部向前挪一个位置。比如K=3,M=5:第一轮:0 1 2 3 4 5 F[1]
2013-08-24 18:28:34
245
原创 POJ3253 Fence Repair
如果想明白考察的是哈夫曼树。那么用STL就比较简单了。#include #include #include #include #include #include #include #include #include #include #include using namespace std;int n;__int64 sum=0;class cmp
2013-08-24 14:22:39
253
原创 POJ2513 Colored Sticks
这题综合性蛮强,数据结构使用到了并查集+trie树,理论用到了欧拉回路。颜色为图中的节点,棍子为边。并查集的元素是数字,要把颜色string隐射到数字,用STL的map进行索引竟然超时。 那于是就用trie树吧。#include #include #include #include #include #include #include #include #include
2013-08-24 02:32:17
273
原创 POJ2503 Babelfish
DescriptionYou have just moved from Waterloo to a big city. The people here speak an incomprehensible dialect of a foreign language. Fortunately, you have a dictionary to help you understand them.
2013-08-23 19:44:36
226
原创 POJ2151 Check the difficulty of problems
DescriptionOrganizing a programming contest is not an easy job. To avoid making the problems too difficult, the organizer usually expect the contest result satisfy the following two terms: 1. Al
2013-08-23 17:58:15
287
原创 POJ3274 Gold Balanced Lineup
DescriptionFarmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been able to narrow down the list of features shared by his cows to a list of only K different features (
2013-08-23 13:21:24
218
原创 POJ 3349 Snowflake Snow Snowflakes
DescriptionYou may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Your program will read information about a collection of s
2013-08-23 00:09:54
274
原创 POJ2299 Ultra-QuickSort
DescriptionIn this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the seque
2013-08-22 18:42:51
282
原创 POJ1035 Spell checker
不能用unordered_map,而且要求顺序要一致。此方法TLE,就是把edit distance编辑距离拿来用。#include #include #include #include #include #include #include using namespace std;vector dict;set myset;int edit_dist(const c
2013-08-20 19:20:35
300
原创 POJ3295 Tautology
DescriptionWFF 'N PROOF is a logic game played with dice. Each die has six faces representing some subset of the possible symbols K, A, N, C, E, p, q, r, s, t. A Well-formed formula (WFF) is any s
2013-08-20 15:30:00
290
原创 SPOJ687 REPEATS
记录一下先。这个代码构建后缀树组效率太低。#include#include#include #include#include using namespace std;const int maxn=50010;int sa[maxn],Rank[maxn],Rank_tmp[maxn],height[maxn];int a[maxn], b[maxn], C[maxn]
2013-08-19 16:06:07
283
原创 Binary Bomb - 二进制炸弹通关解析
Binary Bomb,二进制炸弹。逆向工程,一共有6关,每一关需要玩家输入一个字符串,如成功则进入下一关,失败则exit。
2013-08-08 16:17:52
2459
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅