上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 17 下一页
摘要: 题意: 一个商店里有许多颜料盒,但是每个颜料盒里面没有 grey 这种颜色,而这种颜色可以由任意其他三种颜色配成,每个颜料盒里一开始有 50ml 的各种非 grey 颜色,告诉了 每种颜色和grey颜色的需求量,问最少需要多少个颜料盒才能够用。分析: 贪心。 可以对非 grey的颜色排序,每次找出量最少的三个颜色,在其中每个都 +1 ,然后就可以让 grey 颜色 -1, 这样到 grey 颜色配完之后,找出需求最多的颜色所需要的颜料盒即可。#include<cstdio>#include<cstring>#include<algorithm>using n 阅读全文
posted @ 2012-07-28 13:32 'wind 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 题意: 给一个字符串,求出该字符串的哈夫曼编码的总长度。分析:由于没考虑树中只有一个字符的情况又WA了N 久T-T ,最近总是犯脑残的错误啊。 关于哈夫曼编码 可以看这个.... 留着复习... http://www.thecodeway.com/blog/?p=870#include<cstring>#include<cstdio>#include<queue>#include<algorithm>#define clr(x)memset(x,0,sizeof(x))using namespace std;struct node{ double 阅读全文
posted @ 2012-07-28 12:34 'wind 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 题意: 有n 个木头,知道了每个木头的长和宽,现在要用机器加工这些木头,加工的时候,如果加工过一个木头,再加工另一个木头的时候,如果这个木头的长和宽都大于或等于这个木头就不需要加热的时间,否则需要 1 分钟的加热时间,问加工完这些木头最少需要多少加热时间。分析: 贪心。 加工完一个木头后,尽量找长和宽都大于等于它的并且尽可能和它大小差不多的木头加工。 可以先对长排序,然后对宽排序。#include<cstdio>#include<algorithm>using namespace std;struct node{ int len,wi; bool flag;}q[500 阅读全文
posted @ 2012-07-28 09:54 'wind 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个池塘,只能从第一个池塘开始走,可以在每个池塘中钓鱼,而且知道了每个池塘每五分钟钓鱼的数量都会下降一定额数值,且从池塘到下一个池塘之间都有一定的距离,知道了每个池塘走到下一个池塘的时间和每个池塘一开始能够钓鱼的数量,求在规定的时间内所能钓的最多的鱼的数量。分析: 枚举以每个池塘为终点的情况,找到最大值。 有个注意的地方就是,没枚举一个终点,先把这段路的每个间隔所花时间去掉,这样就可以每次贪心去找单位时间可以钓最多的鱼了,而且可以保证贪心到最后可以找到最优解。#include<cstdio>#include<cstring>#define clr(x)me 阅读全文
posted @ 2012-07-27 23:06 'wind 阅读(869) 评论(0) 推荐(0) 编辑
摘要: POJ刷题分类(一):用的比较多的初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3... 阅读全文
posted @ 2012-07-27 19:44 'wind 阅读(339) 评论(0) 推荐(1) 编辑
摘要: 题意: 有个储蓄罐 ,内部物品重量已知,内部可能有 n 种钱币,知道每个钱币的重量和价值,问储蓄罐内部钱币价值最少是多少。分析: 完全背包,由于是最小价值,所以应把 数组初始为无穷大。#include<stdio.h>#include<string.h>int f[10005];int min(int a,int b){ return a<b?a:b; }int main(){ int t,i,n,v,emp,a,b; scanf("%d",&t); while(t--) { scanf("%d%d",&em 阅读全文
posted @ 2012-07-27 19:34 'wind 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 题意: 有N 个点,且这些点都在整数坐标上,找出一个点使得所有点到这个点的曼哈顿距离和最小。分析:可以以每个点为中心,把平面分别按 位于该点上方, 位于该点下方, 位于该点左方, 位于该点右方, 可以先对 X 排序, 记点的左方所有点到该点的 X 坐标距离差之和为 LX 记点的右方所有点到该点的 X 坐标距离差之和为 RX 求出第一个点的 LX,RX 后,后面的点可依次有前一个点推出 即 LX2=LX+i*dxRX2=RX-(n-i)*dx每个点上方的 Y 距离差之和 SY,和下方的 XY 求法同上, 最后枚举每个点的 LX+RX+XY+SY找出最大值即可。#include<stdio. 阅读全文
posted @ 2012-07-27 18:13 'wind 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 题意:有 n 个地点,已知这些点之间有 m条边,图是有个有向无环图,出度为0 的点唯一,即为 n点,问从入度为 0 的点到出度为 0 的点的所有路径中,经过次数最多的边,并求出最多经过的次数。分析: 因为是有向无环图,可以正反向分别广搜一次,计算出所有点正反向的入度,枚举所有边弧尾的在正向搜索中的入度和弧头在反向搜索中的入度的乘积,找到最大值即为答案。#include<stdio.h>#include<string.h>int g[5005][5005];int d1[5005],d2[5005];int q[5005];int in[5005],out[5005];s 阅读全文
posted @ 2012-07-26 00:39 'wind 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个球,想要对他们进行编号1..n,知道了一些求的轻重的关系,要求轻的球必须排在重的球之前,如果存在没有冲突的排序方法的话,输出字典序最小的排序方式。分析: 没考虑重边,WA了N次!!谨记! 由于要输出字典序最小的情况,所以建图要反向建图,反向进行拓扑排序。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))int g[202][202];int indegree[202];int res[202];int v[202][202];int main(){ bool fl 阅读全文
posted @ 2012-07-25 22:10 'wind 阅读(352) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道一个数n, 然后n行,编号1到n, 每行输入几个数,该行的编号排在这几个数前面,输出一种符合要求的编号名次排序。分析:基础的拓扑排序。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))int g[102][102];int indegree[102];int res[102];int main(){ int p,i,j,k,n,top; while(scanf("%d",&n)!=EOF) { clr(g); clr(indegree); . 阅读全文
posted @ 2012-07-25 21:01 'wind 阅读(1439) 评论(0) 推荐(0) 编辑
摘要: 题意: 已知有 n 块地,和已经存在的 m 条路径,要求找出从第 1 块地到第 n 块地的 T条不同路径,且每条路径上的道路不能与之前的路径重复,求出满足要求的路径中最长的道路最短可以是多少。分析: 二分答案,将满足条件的道路长度容量设为 1 ,求最大流,最大流即为路径的条数。EK:#include<stdio.h>#include<string.h>#include<stdlib.h>#define INF 99999999#define maxn 230#define clr(x)memset(x,0,sizeof(x))#define min(a,b) 阅读全文
posted @ 2012-07-24 15:27 'wind 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 题意: 在一个连通图中,经过每条边刚好两次,并且最终回到起点,找出这样的一条路径。分析: 在每条边基础上加多一条不同方向的边,dfs所有边,找出欧拉回路。#include<stdio.h>#include<string.h>struct node{ int from,to,next;}e[100005];int head[10005];int tot;void add(int s,int u){ e[tot].from=s; e[tot].to=u; e[tot].next=head[s]; head[s]=tot++;}int v[100005];int q[1... 阅读全文
posted @ 2012-07-23 23:20 'wind 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 N 个蚂蚁,N 个苹果,要在每个蚂蚁和一个相应的苹果之间连边,问如何给蚂蚁分配苹果,可以使这些边不相交。分析:应为在最小权值匹配的情况下满足没有边相交,可以简单证明,假设最小完备匹配中有两条线段AC和BD相交于点E,此时我们可以不连接AC和BD而去连接AD和BC,由于AE+DE>AD和BE+CE>BC,所有我们可以得出新连接的边的权值和一定比原来的边的权值和小,这样就可以得到一种权值和更小的匹配,这原来的匹配是最小带权和的匹配矛盾, 因此最小带权和的匹配中不会出现有两条线段相交的情况。code:#include<stdio.h>#include<str 阅读全文
posted @ 2012-07-23 19:05 'wind 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 p 个水手和一个章鱼,章鱼有 n 个脚,知道了所有单位的坐标,和船长以及船员的速度,船长想去攻击章鱼的头部,但是只有在章鱼所有的脚都被水手控制的情况下才会开始朝章鱼头部进攻,问如何分配水手控制的触须,才能在最短时间内是船长攻击到其头部。分析: 二分枚举船员移动的时间ti, 如果水手与某个触须接触所要的时间小于 ti,就在该水手与该触须之间连一条边,找出满足水手与触须最大匹配等于 n 的最小时间,最后加上船长移动到章鱼头部需要的时间即为答案。#include<cstring>#include<cstdio>#include<cmath>#defin 阅读全文
posted @ 2012-07-23 11:13 'wind 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 题意: 一些男生和一些女生之间有爱慕关系,已知一些男生和女生的爱慕关系,学校想从这些学生中找出一些的学生满足这些学生之间彼此都没有爱慕的关系--!~,问找出的这个集合最多可以有多少人。分析:求二分图的最大独立集最大独立集=顶点数-最小点覆盖 由于这道题中爱慕关系是相互的,可以看成是无向图,可以将每个人拆成两个点 由于是无向图 ,最小点覆盖数=最大匹配/2#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))struct node{ int to,next;}e[10000];int t 阅读全文
posted @ 2012-07-21 14:16 'wind 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 F 种食物, D 种饮料,和 N 头牛, 每头牛只吃自己喜欢的食物,喝自己喜欢的饮料,知道了每头牛喜欢哪些 食物 和 饮料,一头牛只有在可以吃到自己喜欢的食物喝到自己喜欢的饮料的情况下才会开心,问如何分配食物和饮料可以使尽量多的牛开心。分析: 在 源点 和 每种食物之间 连一条边,容量为 1,将每头牛拆成两个点,将每头牛的第一个点和第二个点之间连一条容量为 1 的边,在每头牛喜欢的食物和该牛的第一个点之间连一条容量为 1 的边,在每头牛喜欢的饮料和该牛的第二个点之间连一条容量为 1 的边,在 汇点 和每种饮料之间连一条容量为 1 的边,求最大流。#include<stdio. 阅读全文
posted @ 2012-07-21 13:40 'wind 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 题目大意:给出一个图,矿场位置,zfy和kevin的寝室位置,zfy和kevin一起从矿场回寝室,要求他们两人回寝室的最短路径,而且,在保证他们两人都是走的最短路径的同时,还要保证他们两个人一起走的距离尽可能的多。解题报告:以下图为例,3到1的最短路为23,3到2的最短路径为24,他们先从3走到5,然后各自回家,能保证都是走的最短路径,同时也能一起走20的距离首先,必须求出矿场B到各个点的最短路径,求出C到各个点的最短路径,再求出N到各个点的最短路径。我们用D[i][j]表示i到j之间的最短距离使用三次DIJKSTRA算法即可完成然后我们枚举zfy和kevin的分离点,枚举出了B, C, N之 阅读全文
posted @ 2012-07-21 00:45 'wind 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 题意: 给定两个字符串,输出他们的最长公共子序列,要求字典序最小。分析:先用LCS算法将最长公共子序列的长度len求出来,还有数组f[i][j],表示字符串a前i个字符和字符串b前j个字符的最长公共子序列的长度,时间复杂度O(n*m)。然后将两个字符串逆序,方便求最小字典序。用两个二维数组分别记录两个字符串a和b前i个字符中字符c出现的最后位置,la[i][c],字符串a的前i个字符中,字符c出现的最后位置。la[i][c],字符串b的前i个字符中,字符c出现的最后位置。然后从最大长度len到1枚举答案的每个位置的字符,直接暴力会超时,需要优化。利用前面的f[][],la[],lb[]数组进行 阅读全文
posted @ 2012-07-20 12:20 'wind 阅读(1424) 评论(0) 推荐(0) 编辑
摘要: 题意:C国在成果破解J国破坏交通的阴谋之后,国王决定宴请各位大臣,合理制定宴请的人的名单的任务就交给了作为国王智囊团团长的你。你知道国王喜欢热闹,所以你希望能邀请尽量多的人,但是做为直接上下级关系的两个人直接出现在宴会上的时候会显得很尴尬,所以不能同时请有上下级关系的两个人。国王是宴会的主办方,也是这个王国的最高领袖,所以必须到场。为了能为宴会准备的更好,你需要知道整个宴会最多可以邀请多少宾客分析: f[i][1] 表示以i为根节点并包含i的子树的最大值f[i][0] 表示以i为根节点不包含i的子树的最大值 转移方程f[r][1]+=f[son][0];f[r][0]+=max(f[son][ 阅读全文
posted @ 2012-07-19 20:16 'wind 阅读(399) 评论(0) 推荐(0) 编辑
摘要: 题意:J国和C国爆发了战争,J国派出了很多间谍深入到C国内部,经常在C国的城市之间炸毁道路,阻拦C国的军队,C国为了抓到这些间谍,需要派人在城市进行监视,一个城市只要有一个人监视,那么这个城市的所有的道路也都会被监视到,为了能够尽量多的士兵去前线打仗,监视的士兵要尽可能的少,希望靠你编程求出至少需要多少人能实现对所有城市之间道路的监视。分析: // dp[i][0] 在 i 节点不放士兵 // dp[i][1] 在 i 节点放士兵 // dp[i][0]+=dp[j][1] // dp[i][1]+=min(dp[j][0],dp[j][1])#include<stdio.h>#i 阅读全文
posted @ 2012-07-19 20:00 'wind 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 题意:在比赛中会给出n个题,不同做题顺序会有不同的AC系数,假如A先做,B后做的话,B对A的AC系数为4, 反过来 B先做,A后做的话,A对B的AC系数为5,说明先做B后做A将得到更高的AC系数。设Sij表示第i题在第j题做完后才做获得的AC系数,有三道题a, b, c,做题顺序为bac,则系数和为:Sum = Sab + Scb + Sca。求一个做题顺序,使得AC系数和最大。分析: 开始当成是 环状的状态DP ,WA了几个点T T; 用dp[stat][k]表示在 状态stat 下以k题结尾的最大分数,k包含在状态stat中 f[stat][k] 表示在 状态stat 下,stat... 阅读全文
posted @ 2012-07-19 19:51 'wind 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个字符串,可以改变上下顺序,可以在每个单词前加 任意的空格,计算所有单词叠在一起后每一行与上一行相应位置相同的字符数之和,找出最大和。分析: 两两字符串之间可以用 l *l 的算法计算出最大的连续相同的字符数,由于单词前可以加任意的空格数,所以单词的上下顺序不影响结果,由于字符串的长度最大为10 ,总的个数最多为10,所以可以枚举所有状态,找出最大值。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))int max(int a,int b){ return a> 阅读全文
posted @ 2012-07-19 12:17 'wind 阅读(531) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 一个天平, 已知 m 个位置,和 n 个砝码的质量问使得天平平衡共有多少种方法。分析: 用 滚动数组 c1[8000],c2[8000], c1[i] 表示 平衡度为 i 当 0<i<8000 时 表示重心在左侧, 当 8000<i<16000 时表示重心在右侧, 最后 c1[8000] 表示的即为平衡的情况数, 递推式 c1[j]+=c2[j+a[i]*p[k]];#include<stdio.h>#include<string.h>int c1[16005],c2[16005];int p[30],a[30];int main() 阅读全文
posted @ 2012-07-19 10:21 'wind 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 题意: 在 n 个整数之间添加 n-1 个+ 或 - 问 运算之后能否被 k 整除。分析: 状态转移方程 dp[i][j]=dp[i-1][j-a[i]]||dp[i-1][j+a[i]]#include<stdio.h>#include<string.h>int d[10001][105];int a[10001];int main(){ int i,j,ps,ms,n,k; while(scanf("%d%d",&n,&k)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&am 阅读全文
posted @ 2012-07-19 09:24 'wind 阅读(340) 评论(0) 推荐(0) 编辑
摘要: 题意:从n个人中选出m个,每个人有固定的p值,d值,要求使m个人的p总和和d总和的差的绝对值最小,若有多解则取两者和最大的。分析:dp[i][j]表示在选m个人中的第i个人的时候使所有已选中的人的b,p差为j时,所能获得的b,p最大和。 dp[i + 1][j + b[k] - p[k]] = dp[i][j] + b[k] + p[k];(要求k之前没有选过,要查看[i][j]的完整路径,确保无k) 填写完成后,观察找到最小差值,最大和。知道和差自然可以求出总的p,d。View Code #include<stdio.h>#include<string.h>#incl 阅读全文
posted @ 2012-07-18 19:29 'wind 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 题意: 在一个树中找出权值和最大的一个连通子集。分析: 和 1463 几乎一样的题, 状态转移方程 // dp[i][0]以i 为根节点不包含i 的值 // dp[i][1]以i为根节点包含 i的值 // dp[i][0]=max(dp[j][1],dp[j][0]) // dp[i][1]+=min(dp[j][0],dp[j][1]) j 为 i 的儿子View Code #include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))struct node{ int x,y,w;}p[10 阅读全文
posted @ 2012-07-17 19:28 'wind 阅读(510) 评论(0) 推荐(0) 编辑
摘要: 题意: 找出无向图的割点,并判断每个割点去掉后能形成多少个双连通分量。分析: 割点的定义: 在深搜树中,时间戳为 dfn[k] ,当 K 满足(1)(2)中一个时,k 为割点 (1) k 为深搜树的根,当且仅当 k 的儿子个数>=2 时 k 为割点;(2) k 为深搜树的中间节点(k 既不是根也不是叶),那么k 必然有父亲和儿子; 对于(1)是显然的,根结点k一旦有2个以上的分支,那么删除k必然出现森林; 对于(2)首先注意low[son]>= dfn[k]这个条件,意思就是“k的儿子son的辈分最高的祖先(暂且设其为w)的深度,比k的深度要深(或者等于k的深度,此 时k就是w), 阅读全文
posted @ 2012-07-17 15:52 'wind 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 题意: 一个有 N 个景点的岛,任意两个景点都有道路相连,当道路施工时,游客便不能在该道路上通行,问至少再增加几条道路可以使得在任一条道路维修的情况下,游客都能从岛上任意一个景点到达另一个景点。分析: 当原图中存在桥的时候,即原图不是双连通图的时候,目的就无法达到,所以这题的关键在于 需要增加几条边可以使得原图中不存在桥。 可以先找出原图中所有的边双连通分量,对其进行缩点,缩点具体做法是将 图中low值相同的节点看作一个点, 缩点后,原图可以看成是一颗树,而要使得一棵树变为一个双连通图,有一个定理: 增加的边数 = (树中总度数为1的节点数+1)/ 2转一大神分析:对于这种题,我们正常的做法是 阅读全文
posted @ 2012-07-16 15:00 'wind 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 题意: 给一个有向图,问该图是不是强连通图,且图中每条边仅属于一个环。分析: 如果一个节点已经在栈中,当该点被访问到即又出现了一条连向该点的横向边,且该点不是根节点,这条边 就是一条属于两个环的边。code:View Code View Code #include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))const int maxn=20002;struct node{ int to; int next;}e[50005];int tot;int head[maxn];void add(i 阅读全文
posted @ 2012-07-15 22:04 'wind 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 题意: 在有 n 个节点的有向图中 有 m 条边,问最少需要增加多少条边可以将原图变成一个强连通图。分析: 因为图中每个环都满足强连通的性质,可以用强连通分量的算法将原图中的环进行染色缩点。 缩点的最大好处在于把一个杂乱无章的有向图变成一个有向无环图,而在有向无环图中,有两种点 比较特殊: 一种是入度为 0 的点,另一种是 出度为 0 的点。 题目问要增加多少条边使得原图变成强连通图,其实只要知道在树根个叶子之间加多少条边,假如r 为根的个数, g 为叶子的个数,答案即为max(r,g)。 特殊情况是当缩点之后只有一个点时,答案为 0。code:View Code #include<st 阅读全文
posted @ 2012-07-15 21:17 'wind 阅读(320) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 17 下一页