随笔分类 -  算法那些事儿~

算法数据结构,Acmer
摘要:http://poj.org/problem?id=1966POJ 1966 Cable TV Network算法核心:网络流-SAP#include#includeconst int N = 50*2+5;const int INF = N;const int MAXN=N;const int maxn = N;int map[N][N];int cmap[N][N];int getNum(){ char c; int num = 0; while(c=getchar()) { if(c='0')break; } while(c='0') { num=num* 阅读全文
posted @ 2011-02-23 15:19 AndreMouche 阅读(547) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1459POJ 1459 Power Network大意:已知供电站的最大供电量,消费者的最大消费量,电线传输电量的上限,求整个供电网的最大供电量算法核心:SAP#include#includeconst int N = 100+5;const int MAXN =N;const int INF = 20000+200+2;int S,T;//S为源点,T为汇点int graph[N][N];int getNum(){ int num = 0; char c; while(c=getchar()) { if(c='0')bre 阅读全文
posted @ 2011-02-23 15:08 AndreMouche 阅读(357) 评论(0) 推荐(0)
摘要:POJ 1149 PIGS大意:有m个猪圈和n个顾客,最初猪圈是锁着的。每个顾客有其中的A把钥匙,需要买B头猪顾客在买完猪便将门锁上,而且顾客是按照顺序来的。商家可以对开着的猪圈里面的猪进行任意调配分析:构图1.将猪圈编号为1,2,。。。。m;2.将顾客编号为m+1,m+2,....m+n3.源点为0,汇点为m+n+14.若猪圈i有a[i]头牛,那么建立一条从0到i,流量为a[i]的边5.若顾客j是第一个能打开猪圈i的顾客,那么从猪圈i到顾客j之间建立边,流量无限大6.若顾客j是能打开猪圈i的第k个顾客,第k-1个顾客为x,那么从顾客x到顾客j建立一条边此题使用的最大流模板是SAP,BlueS 阅读全文
posted @ 2011-02-23 14:47 AndreMouche 阅读(530) 评论(0) 推荐(0)
摘要:2010-08-24 00:44来源http://hi.baidu.com/lerroy312/blog/item/d7ea97ee7b1f3cddd439c927.html点连通度的定义:一个具有N个点的图G中,在去掉任意k-1个顶点后(1=2,则任意K个顶点共圈。求边连通度总结:同样引入独立轨的概念,只是在这里叫弱独立轨,同样在每条弱独立轨中只有去掉某一条边就可以使起点到终点不连通,现在整个图G的边连通度就是要找出任意两点的弱独立轨的最小值。如果图G为完全图,则K`(G)为n-1。构建一个网络N若G为无向图:1. 原G图中的每条边e=UV变成两条边e`=UV,e``=VU,容量都为1;2. 阅读全文
posted @ 2011-02-19 21:30 AndreMouche 阅读(2510) 评论(1) 推荐(0)
摘要:http://poj.org/problem?id=2154poj 2154:Colorhttp://blog.sina.com.cn/s/blog_6f71bea30100opru.html大意:n种颜色的珠子可组成多少种长度为n的项链?这题和2409 类似,不同之处在于,只考虑旋转,不考虑翻转;因此相对前面两个题目应该说是更简单,但一看数据范围,就不是这么回事了,2409完全可以直接循环处理,但这题目n最大达100000000,显然会TLE,故需寻求更佳的解决方案。用欧拉函数进行优化:旋转:顺时针旋转i格的置换中,循环的个数为gcd(i,n),每个循环的长度L为n/gcd(i,n)。如果枚 阅读全文
posted @ 2011-02-16 16:26 AndreMouche 阅读(1136) 评论(0) 推荐(0)
摘要:POJ 2409 Let it Bead算法核心:polya 计数法,burnside定理http://blog.sina.com.cn/s/blog_6f71bea30100opru.html大意:珠子的颜色有c种,问可组成多少种长度为s的项链?分两种情况讨论:旋转:n种旋转方法每种旋转i个格(1#includeconst int N = 35;bool prime[N];void init(){ int i,j; memset(prime,true,sizeof(prime)); for(i=2;ib) { r=a;a=b;b=r; } while(a) { r=b%a; ... 阅读全文
posted @ 2011-02-16 16:23 AndreMouche 阅读(638) 评论(0) 推荐(0)
摘要:POJ 1252 Euro Efficiency大意:六种货币,面值都小于100。用这六种货币(可加可减)用最少的货币数组成1到100。求出这1到100中最大的,并求平均值。两个完全背包即可,一个付钱,一个找钱#include#includeconst int N = 10000+100+2;int dp[N];int a[6];int min(int a,int b){ if(a==-1)return b; return a=0;j--) if(dp[a[i]+1]!=-1) dp[j]=min(dp[j],dp[j+a[i]]+1); } __int64 ans = 0; ... 阅读全文
posted @ 2011-02-14 14:56 AndreMouche 阅读(544) 评论(0) 推荐(0)
摘要:POJ 3260 The Fewest Coins网上有篇很好的报告,觉得不错,就拷了些过来,(*^__^*) 嘻嘻……网址:http://www.cppblog.com/Davidlrzh/articles/135614.html题意:John去买东西,东西的价格是T(1 #includeconst int T = 14400+1;const int T2 = T+14400+2;const int N = 101;int change[T];//change[i]表示商店找钱i所需的硬币数int dp[T2];//dp[i]表示用户付钱i所需硬币数int c[N];int v[N];__i 阅读全文
posted @ 2011-02-14 13:44 AndreMouche 阅读(1044) 评论(0) 推荐(0)
摘要:ZOJ 3474 TaekwondoAuthor: HUANG, QiaoContest: ZOJ Monthly, February 2011H算法核心:贪心大意:已知:1.Alice 有n个敌人,现有的能量值为S2.每个敌人的基本信息:p1,p2,p3,r. 其中p1为消耗敌人3个积分所需要的能量 p2为消耗敌人2个积分需要的能量 p3为消耗敌人1个积分所需能量, r为消灭该敌人后所能获得的能量值3.消灭一个敌人至少需要消耗它的积分7个问Alice能否完全消灭这n个敌人,若能,求出Alice所能剩余的最大能量分析:1.对于每个敌人,计算出消灭它所需要的最小能量(只有三个状态,枚举p1,p2 阅读全文
posted @ 2011-02-14 10:17 AndreMouche 阅读(510) 评论(0) 推荐(0)
摘要:ZOJ 3468 Dice War2010ZOJ月赛B题大意:有两堆筛子,个数分别为a,b,求第一堆筛子点数和大于第二堆筛子点数和的概率算法DP,注意精度,比赛时就死在这里了~~~~(>_#includeconstint N =490;constint M =9;double dp[M][N];double sum[M][N];void init(){ int i,j,k; for(i=0;i=0;k--) sum[i][k]=sum[i][k+1]+dp[i][k]; }}int main(){ int a,b; init(); while(scanf("%d%d" 阅读全文
posted @ 2011-02-13 18:43 AndreMouche 阅读(443) 评论(0) 推荐(0)
摘要:POJ 3414 Pots大意:有两只桶,容量分别为a,b,对每只桶,有以下三种操作:1.Fill(i)装满第i只桶2.DROP(i)将桶i的水倒掉3.POUR(i,j),将桶i中的水倒入桶j,若桶j满,剩余的水遗留于桶i中问能否通过这些操作使得某只桶恰好装有容量为c的水?若能,输出最少操作次数及过程PS:c#include#includeusingnamespace std;constint N =101;struct pn{ int prex; int prey;}pre[N][N];struct node{ int a,b; int step; booloperatorBif(a==0| 阅读全文
posted @ 2011-02-12 20:59 AndreMouche 阅读(376) 评论(0) 推荐(0)
摘要:POJ 2479 Maximum sum算法核心:dp对于n个连续数字,在其中任意取出两个不重叠的连续段,求所有合法条件下该两个连续段和的最大值例如: n = 10,数字为:1 -1 2 2 3 -3 4 -4 5 -5 此时答案为13 ,即(2,2,3,-3,4)与(5)的和#includeconstint N =50000+1;int dp1[2];//dp[i]记录包含数字i的前i个数字的一段最大和int dp2[2];//dp2[i]记录前i个数字的一段最大和int dp3[2];//dp3[i]记录到包含数字i的两段最大和inline int max(int a,int b){ re 阅读全文
posted @ 2011-02-12 15:02 AndreMouche 阅读(483) 评论(0) 推荐(0)
摘要:POJ 2449 Remmarguts' Datehttp://poj.org/problem?id=2449算法核心:A*、dijkstra大意:求有向图中从s到t的k短路分析:1.用dijkstra逆向计算出所有点到t的最短距离dis[i]2.建立估价函数 f(i)= g(i)+h(i) 其中g(i)为从s到i的实际距离,h(i)为从i到t的最短路dis[i]3.使用上述估计函数用A*算法从s点出发BFS全图,用visited[i]表示点i的出队次数。 当visited[i]=k时,即找到从s到t的k短路为f(i) 其间若visited[i]>k则放弃该点4.注意:若s==t 阅读全文
posted @ 2011-02-12 14:03 AndreMouche 阅读(1371) 评论(0) 推荐(0)
摘要:http://watashi.ws/blog/1813/zojmonthly1101/ZOJ3457/ZOJ 3457 Absence Number大意:给定一个两位数N,求最小的m,使得1/m的十进制表示中恰好包含除N以外的所有两位数。最大的解是N=0时m=76344。题目的输入只有100种,所以可以暴力跑表,1/m十进制表示是循环小数,且在m步内开始循环,所以很容易求得其包含的所有两位数,最后判断一下是否满足条件就好了。注意不要漏数了两个循环节头尾组成的那个两位数,否则有几个数据会WA。更简单的方法是不判断循环节,直接循环m+1步。加上一些优化后,这个表实际可以在1s之内跑出。 但是我不会 阅读全文
posted @ 2011-02-11 22:30 AndreMouche 阅读(538) 评论(0) 推荐(0)
摘要:POJ 1681 Painter's Problem算法核心:状态压缩,枚举大意:有一面n*n的墙,对其中某一格子上色,则其上、下、左、右及自身的颜色均变色,颜色仅有黄色和白色两种,已知墙面信息,问能否将墙面全部变为黄色,若能,至少需要涂色几次?分析:1.通过状态压缩,枚举第一行的着色网格2.通过已知的第一行着色状态,根据上层信息依次推得下层着色状态3.对2退出的第n层着色状态进行判断,若合法,更新当前最小值。#include#includeconstint N =17;constint inf =99999;bool graph[N][N];//graph[i][j]存储最初的颜色, 阅读全文
posted @ 2011-02-11 22:22 AndreMouche 阅读(555) 评论(0) 推荐(0)
摘要:POJ 1948 Triangular Pastures题目描述:给最多40根木棍,每根长度不超过40,要用完所有的木棍构成面积最大的三角形,求出最大的面积。算法核心:二维01背包 使用到海伦公式: 已知三角形的三边长度a,b,c,求面积 S=√[p(p-a)(p-b)(p-c)] 而公式里的p为半周长: p=(a+b+c)/2 分析:用dp[i][j][k]表示到第i根木棒能否摆出边长分别为j,k的三角形 易得 dp[i][j][k] = dp[i-1][j-x[i]][k]|dp[i-1][j][k-x[i]]|dp[i-1][j][k]; 简单的空间压缩,化为二维dp,注意:这里每根.. 阅读全文
posted @ 2011-02-11 22:18 AndreMouche 阅读(885) 评论(0) 推荐(0)
摘要:POJ 2418 Hardwood Species算法核心 二叉查找树题目大意:通过卫星得到了某一个区域的树名,将这些树名按字典顺序输出,并输出在树的总数中所占的比例,保留小数点后四位。主要思想:对每种树做统计,并计算出所占的比例并不难。难的是如何在规定时间内按字典顺序输出输入中涉及的树名。字典顺序可以启发我们用排序的方法解决,我们可以把树名作为关键字来比较大小,而strcmp函数也给了我们比较大小提供了条件。接下来就是要解决时间问题。如果用插入排序的算法由于大量的数据需要大量的比较,就会超时。所以这里借助了比较经典的数据结构,二叉查找树。那么我们就可以先对输入建树,然后再通过树的中序遍历来输 阅读全文
posted @ 2011-01-29 15:53 AndreMouche 阅读(693) 评论(0) 推荐(0)
摘要:POJ 3281 Dining核心算法:网络最大流大意:有n头牛,F种食物,D种饮料,第i头牛喜欢fi种食物,di种饮料,编号分别为。。。 已知一头牛最多能吃一种食物和一种饮料,每种饮料 或食物最多能被一头牛吃,求以上条件下,最多能有多少头 牛能吃到他所喜爱的食物和饮料建立模型: 建立网络流模型:1.对每种食物建立从源点指向它的一条边,流量为1 2.在牛与它所喜爱的食物间建立一条边,流量为13.在牛与它所喜欢的饮料间建立一条边,流量为14.对每种饮料建立一条指向汇点的边,流量为15.在上面的基础上,将牛拆点,在拆开的点间建立一条流量为1的边 在以上条件下,从源点到汇点的最大流即为答案 模型的分 阅读全文
posted @ 2011-01-29 13:23 AndreMouche 阅读(594) 评论(0) 推荐(0)
摘要:POJ 1185 炮兵阵地核心算法:dp状态压缩中文题分析:graph[i]存储第i行的地形,用一二进制数表示,山地对应位置为1,平地对应位置为0leg[N]中存放所有能够合法的单行安排状态,用二进制数表示,驻兵对应位置为1,不驻兵对应位置为0dp[i][j][k]表示第i行状态为j,i-1行状态为k时最多的哨兵数目,j,k均对应leg[]中状态dp[i][cur][p1] = getmax(dp[i][cur][p1],dp[i-1][p1][p2]+leg[cur].army);其中: p1为第i-1层的合法行存放状态 p2为第i-2层的合法行存放状态, cur为当前即第i层合法行存放状态 阅读全文
posted @ 2011-01-28 21:01 AndreMouche 阅读(821) 评论(0) 推荐(0)
摘要:HDU 1074 Doing Homework算法核心:状态压缩DP大意:有n门课程作业,每门作业的截止时间为D,需要花费的时间为C,若作业不能按时完成,每超期1天扣1分。这n门作业按课程的字典序先后输入问完成这n门作业至少要扣多少分,并输出扣分最少的做作业顺序PS:达到扣分最少的方案有多种,请输出字典序最小的那一组方案分析:n#include#includeconstint N =65536;struct node{ int cost;//所需要的时间int pre;//前一状态int reduced;//最少损失的分数}dp[N];//dp[i][j]表示在第i天完成作业信息为jbool. 阅读全文
posted @ 2011-01-28 14:21 AndreMouche 阅读(2218) 评论(0) 推荐(0)