|
|
|
|
|
07 2012 档案
poj - 2253 Frogger
摘要:这题要说是最短路吧,其实更像DP,因为不需要把路径相加,而是更新为最小值。做这题最大的收获就是我才知道原来优先队列也能间接排序,自己写个cmp就行了,而且原理和sort的cmp一样。真的要感谢che学长。 1 #include <stdio.h> 2 #include <string.h> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 using namespace std; 7 int n,m=1; 8 double d[205]; 9 bool used[2
阅读全文
poj - 3259 Wormholes
摘要:这题和poj 1860很像,不过那个是求上升回路,这题是求下降回路。 1 #include <stdio.h> 2 #include <string.h> 3 int u[5400],v[5400],w[5400]; 4 int d[505]; 5 int n,m1,m2; 6 bool Bellman() 7 { 8 int i,j; 9 memset(d,0x3f,sizeof(d));10 d[1] = 0;11 for(j = 1; j < n; j++)12 {13 bool ok = 1;14 for(i = ...
阅读全文
poj - 2240 Arbitrage
摘要:同样是套汇问题,这题要简单些,我为了多练,换成Floyd算法了。Floyd最大的优点就是写起来简单。 1 #include <stdio.h> 2 #include <string.h> 3 int m,n,cas=1; 4 char name[35][40]; 5 double rate[30][30]; 6 int find(char *s) 7 { 8 for(int i = 0; i < n; i++) 9 if(!strcmp(s,name[i]))10 return i;11 return -1;12 }13 bool Flo...
阅读全文
poj - 1860 Currency Exchange
摘要:最短路问题,用Bellman算法判断有无正向环。 1 #include <stdio.h> 2 double M[105],orig; 3 int m,n,s; 4 typedef struct 5 { 6 int u,v; 7 double r,c; 8 void init(int a,int b,double q,double p) 9 {u = a; v = b; r = q; c = p;}10 }Edge;11 Edge ed[205];12 void read_graph()13 {14 int a,b,i;15 double q,w...
阅读全文
poj - 1258 Agri-Net
摘要:就是简单的最小生成树,本来用卡尔(Kruskal)算法写也没什么难的,可是偏偏要求用Prim写,搞得我很纠结,总算明白为什么白书里不说它了,因为写起来真的很麻烦,效率也不见得高多少。 1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 using namespace std; 5 int a[105][105]; 6 bool vis[105]; 7 typedef struct 8 { 9 int a,b,w;10 void init(int x,int y,int z)11 {a
阅读全文
poj - 2367 Genealogical tree
摘要:简单的拓扑排序,就是每次寻找入度为0的点,高级一些的BFS算法本质上和这个也是一样的。 1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 using namespace std; 5 vector <int > a[105]; 6 int in[105],ans[105]; 7 int main() 8 { 9 int n,m,i,j,t,l;10 while(~scanf("%d",&n))11 {12 memset(in,0,sizeo
阅读全文
poj - 1742 Coins
摘要:楼教主的“男人八题”之一,多重背包问题,che男让我用单调队列来做,可是我觉得单调队列太头疼,就搜了另外一种思路,然后自己写了一个。于是诡异的事情发生了,该题的Disscus里面也有一个我和的思路一模一样的代码,代码也几乎一模一样,连开的数组大小都是一样的,想说我不是抄的都没人信啊,郁闷。这是Disscus里面的: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 bool can_pay[100005]; 7 int use_a
阅读全文
poj - 1651 Multiplication Puzzle
摘要:简单DP,矩阵相乘,这次尝试自己写一个,居然过了,很好。本来今天还水了poj 1088 二维空间最长下降(上升)序列和 poj 3624 超水0,1背包,也想贴出来凑数的,可是zxpn同志说,这么水的题你也好意思贴出来,只好做罢。 1 #include <stdio.h> 2 #include <string.h> 3 int f[100][100],a[105]; 4 int dp(int i,int j) 5 { 6 int k, min, &ans = f[i][j]; 7 if(f[i][j] != -1) 8 return ans; 9 if(...
阅读全文
poj - 1887 Testing the CATCHER
摘要:曾经的WF题,如今我一个小菜鸟都能做出来了,可见时代在进步啊。这题用nlogn算法做的,由于不知道有多少个数,所以数组要开大些,反正我随便开了一个是够了。 1 #include <stdio.h> 2 #include <string.h> 3 int c[2000],len=-1; 4 int find(int t) 5 { 6 int le=0,ri=len,mid; 7 while(le <= ri) 8 { 9 mid = (le+ri) >> 1;10 if(c[mid] == t)11 return m...
阅读全文
zoj - 1008 Gnome Tetravex
摘要:典型的回溯,这题我一拖再拖,拖了好几天,然后觉得自己写不出来。可是今天搜了一下,答案是如此简短明了,我真的很诧异,难道我真的不行?好吧,我是一个回溯都没写过,所以才会这么力不从心,决定做几题练一练。 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int q[25]; 5 int s[25][4]; 6 int num[25]; 7 int flag,n,l; 8 void dfs(int len) 9 {10 if(flag)11 return;12 if(len == n...
阅读全文
poj - 3126 Prime Path
摘要:今天这题算是巩固BFS了,昨天的经验是把“判断”转到一个位置,就能大幅度提高效率,今天更奇葩,我按照昨天总结的“完善”的方法,超了一次又一次时,仿佛昨天都是浮云。最后又把判断移了一个位置,奇迹出现了,从TLE变为16ms,难怪说搜索的效率都很低,今天算是明白了。 1 #include <stdio.h> 2 #include <string.h> 3 bool isprime[10005],vis[10005]; 4 int a,b,step[4000],d[4]; 5 int head,end,q[4000]; 6 int bfs() 7 { 8 int m,n,i,
阅读全文
poj - 1915 Knight Moves
摘要:经典的走马步,BFS里的基友,啊不,基础题,我却花了老长时间。今天做这题时遇到了两个奇葩问题,一是数组越界了居然不RE,当初我的队列只开了300+,然后head都飙到460了程序还正常运行;另一个就是我在BFS里没有对x2,y2进行任何修改,它居然姚明进去,郭敬明出来了。最后还是要感谢Samsara帮我找到了问题,把数组开大了。我想,说不定第二个问题就是由第一个引起的,难道是CodeBlocks太智能了,知道我写的是队列,然后自动*#$…… 1 #include <stdio.h> 2 #include <string.h> 3 int map[310][310],en
阅读全文
poj - 2255 Tree Recovery
摘要:今天只水了一道二叉树重建,本来白书上是有代码的,可惜我的白书锁教室了,只好自己想了一下,还算可以。 1 #include <stdio.h> 2 #include <string.h> 3 int cnt; 4 char c[30]; 5 void build(char * s,char * t,int l) 6 { 7 if(l == 1) 8 {c[cnt++] = *s; return ;} 9 int n = strchr(t,s[0]) - t;10 if(n) build(s+1,t,n);11 if(l-n-1)12 bui...
阅读全文
spoj - 7259 LITE
摘要:涉及到lazy思想的线段树,难度大一些,不过幸好只有一种操作,扛得下。 1 #include <stdio.h> 2 #include <string.h> 3 #define N 100005 4 int tree[4*N],D; 5 bool rev[4*N]; 6 void build(int cur,int x,int y) 7 { 8 int mid=(x+y)>>1,lc=cur<<1,rc=lc|1; 9 rev[cur] = 0;10 tree[cur] = 0;11 if(x == y)12 return ;13 bui...
阅读全文
poj - 2352 Stars
摘要:典型线段树,因为Input已经按Y坐标处理过了,所以程序只需处理X值就行了,也就是查询、更新。 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 const int N = 32005; 5 int tree[4*N],D; 6 int level[15010]; 7 void update(int n) 8 { 9 for(; n^1; n>>=1)10 tree[n>>1] = tree[n] + tree[n^1];11 }12 void query(in
阅读全文
poj - 2182 Lost Cows
摘要:这题的意思是有编号1~N的牛,给出每个(除了第一个)牛前面比它号小的牛的个数,输出牛是怎么排的队。没想出怎么用线段树做,就当模拟题做了。 1 #include <stdio.h> 2 #include <string.h> 3 int a[8500],ans[8500]; 4 bool vis[8500]; 5 int main() 6 { 7 int n,i,j,cnt; 8 while(~scanf("%d",&n)) 9 {10 memset(vis,0,sizeof(bool)*n);11 for(i = 1; i < n; i
阅读全文
poj - 3264 Balanced Lineup
摘要:简单题,求一定范围内的最大数于最小数之差,用两个数组保存max和min就行了。 1 #include <stdio.h> 2 #include <string.h> 3 #define N 50005 4 #define INF 0x7fffffff 5 int max[4*N],min[4*N]; 6 int D; 7 int Max(int a,int b) 8 { 9 return a>b ?a :b;10 }11 int Min(int a,int b)12 {13 return a<b ?a :b;14 }15 int query(int a,in
阅读全文
hdu 4006 The kth great number
摘要:这题虽然是线段树的作业,但我是用pq偷懒过的,它的思路和poj 1442差不多,但要简单。 1 #include <stdio.h> 2 #include <queue> 3 using namespace std; 4 int main() 5 { 6 int m,n,k,t,cnt; 7 char ch; 8 while(~scanf("%d%d",&m,&n)) 9 {10 cnt = 0;11 priority_queue <int> small;12 priority_queue <int, vector.
阅读全文
hdu 1394 Minimum Inversion Number
摘要:求最少逆序是多少,推荐用线段树,但暴力也能过,我用的方法两者皆非。我只是用暴力求第一种排列的逆序数,剩下的用小技巧推出。 1 #include <iostream> 2 using namespace std; 3 int a[5010]; 4 int main() 5 { 6 int n,i,j,ans,min; 7 while(cin>>n) 8 { 9 for(i = 0; i < n; i++)10 cin>>a[i];11 ans = 0;12 for(i = 0; i < n-1; i+...
阅读全文
hdu 1166 敌兵布阵
摘要:这题用了自顶向下的递归方式。 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 const int MAXD = 50005; 5 int tree[4*MAXD]; 6 int a[MAXD],D; 7 int query(int x,int y) 8 { 9 int i=D+x-1, j=D+y+1, ans=0;10 for(; i+1 != j; i>>=1,j>>=1)11 {12 if(~i & 1)13 ans += tree[i^...
阅读全文
poj - 3258 River Hopscotch
摘要:最小值最大化问题,刚开始没思路,还是经che兄提醒,用二分,然后百度之,抄了一份。不过我是个有原则的人,就算要抄,也是要先理解才行,然后手打一份。为了证明彻底理解,偶尔还会小改动一下,比如把数组从1开始改为从0开始,for循环的条件改一下等等。 1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 int a[50005]; 5 int l,m,n; 6 bool ok(int mid) 7 { 8 int cnt=0,start=0,i; 9 for(i = 0; i <= n
阅读全文
hdu 2795 - Billboard
摘要:第一眼看这题不知所云,现在已经能轻松分析,看样子这两天进步还是有的。这题h是10^9的,看起来有点吓人,但因为n只有20W,所以h是10^999也没用,当h很大时数据范围就被固定在n上了,这点要多谢chenan前辈的提醒。 1 #include <stdio.h> 2 #include <string.h> 3 #define N 200005 4 int tree[4*N],D; 5 int max(int a,int b) 6 { 7 return a>b ?a :b; 8 } 9 void update(int n)10 {11 for(; n^1; n &
阅读全文
poj - 3468 A Simple Problem with Integers
摘要:今天的难度又增加了,在好不容易把练习A了以后,才发现,昨天的题根本就不叫题,我一口气刷得就剩一题了。只能说,攻克变态题的方法,就是去做更变态的题,然后原来的题就不变态了……今天的作业,我的收获是,change、pushdown等涉及数据的函数的关键内容,是要随题目变化的。 1 #include <stdio.h> 2 const int N = 100005; 3 long long sum[4*N]; 4 long long add[4*N]; 5 int D; 6 void update(int cur) 7 { 8 sum[cur] = sum[cur<<1] +
阅读全文
hdu 1754 I Hate It
摘要:今天听斌哥讲课,果然V5,讲的是竞赛用堆,从基本到扩展,自顶向下和自底向上,递归与非递归……基本是听懂了,刷了两题,把顶和底都敲了一遍,都A了。本来打算把课后练习刷完的,无奈还不习惯高强度训练,做了两题以后感觉脑力枯竭了,怎么也做不下去了,唉。hdu 1754 1 #include <stdio.h> 2 #include <string.h> 3 const int MAXD = 200005; 4 int tree[4*MAXD]; 5 int D; 6 int max(int a,int b) 7 { 8 return a>b ?a :b; 9 }10 vo
阅读全文
poj - 1442 Black Box
摘要:好久没刷题了,脑子都锈掉了。这题是用优先队列做的,而且是STL里的。STL里的priority_queue默认是大堆,你可以理解为递减数列。如果要用小堆需要一点参数,我只记得一个简单些的方法:priority_queue<T, vector<T>, greater<T> >,T表示数据类型,这样就是一个小堆了。做这题时我“参考”了别人的代码,不过原版的注释写得很混乱,不知道是不是用来忽悠人的。以下是代码: 1 #include <iostream> 2 #include <queue> 3 using namespace std; 4
阅读全文
|
|