BZOJ1914
摘要:对于每一个点,它与原点的连线将平面划分为两个半平面,我们统计连线的逆时针方向的半平面中的点的个数N,这N个点与这个点构成的N(N-1)/2个三角形都是不包含原点的.最后只要用总个数减去这些三角形的和就是答案.统计过程极角排序后可以做到O(N)./************************************************************** Problem: 1914 User: exponent Language: Pascal Result: Accepted Time:260 ms Memory:1008 kb *...
阅读全文
posted @
2011-08-24 18:00
exponent
阅读(530)
推荐(0)
BZOJ1916
摘要:记忆化搜索,f[u,k]表示到节点u时,剩下k次失控的机会,所能得到的最大快乐值.f[u,k]=max{f[v,k]+w[u,v]} f[u,k]=min(f[u,k],f[v,k-1]+w[u,v]) (v是u的儿子)/************************************************************** Problem: 1916 User: exponent Language: Pascal Result: Accepted Time:996 ms Memory:6868 kb *************...
阅读全文
posted @
2011-08-24 17:50
exponent
阅读(281)
推荐(0)
BZOJ1828
摘要:按右端点排序,插入即可./************************************************************** Problem: 1828 User: exponent Language: Pascal Result: Accepted Time:1892 ms Memory:9212 kb ****************************************************************/ type node=record l,r,s,a:longint; en...
阅读全文
posted @
2011-08-21 19:01
exponent
阅读(282)
推荐(0)
BZOJ1827
摘要:首先初始化解为在点1的代价.从一个点u移动到另一个点v,相当于以v为根的子树上的所有点少走dis(u,v),其余点多走dis(u,v).dfs遍历一次就可以出解了./************************************************************** Problem: 1827 User: exponent Language: Pascal Result: Accepted Time:628 ms Memory:5824 kb *****************************************...
阅读全文
posted @
2011-08-21 15:20
exponent
阅读(315)
推荐(0)
RQNOJ491
摘要:题目描述小雪的学校成立了学生法庭,他被推举为大法官。法庭的裁决取决于陪审团的决定,陪审团的人员来自学校的同学。每次开庭前,法庭会聘请n人作为侯选陪审员,其编号分别为1,2,…,n;然后由大法官从n位侯选陪审员中选出m人作为正式陪审员。具体的选择过程如下:由原告和被告分别给每一位候选陪审员打分,分值范围为[0, 20],0分表示完全不喜欢,20分表示此人非常适合作陪审员。大法官将根据原告和被告双方对每一位侯选陪审员打出的分数来选择m人作为正式的陪审员。为了保证公平审判,原告被告双方对最终陪审团的喜好程度应该尽量平衡。具体而言,给定n个侯选陪审员以后,选出m个人组成陪审团的原则是:原告方和被告方对
阅读全文
posted @
2011-08-21 10:53
exponent
阅读(397)
推荐(0)
BZOJ1778
摘要:高斯消元.参考:http://blog.csdn.net/dfs35123/article/details/5823013/************************************************************** Problem: 1778 User: exponent Language: Pascal Result: Accepted Time:696 ms Memory:1212 kb ****************************************************************/ const maxn=301; var
阅读全文
posted @
2011-08-20 17:26
exponent
阅读(361)
推荐(0)
BZOJ1777
摘要:以深度划分节点为两类,奇数深度和偶数深度的节点(根节点深度为0).我们的最终目的是使得所有石子在根节点上,也就是奇数数深度的节点上的石子数之和为0.对于从偶数节点向奇数节点移动的石子,可以从奇数节点上再次向偶数节点移动,从而使得奇数节点上的石子数之和不变.所以我们只需考虑从奇数节点向偶数节点移动的情况.这显然就是Nim游戏了.注意一下对L的处理.code:/************************************************************** Problem: 1777 User: exponent Language: Pascal Result: Acc
阅读全文
posted @
2011-08-17 11:37
exponent
阅读(585)
推荐(0)
BZOJ2097
摘要:题意:最多去掉一个树上的s条边,将树分割成S+1块,使得所有块的最长链的最大值最小.USACO官方的题解讲的很清楚..First, conduct a binary search on the answer, D. To do this, just find a way to check, for any D, if it is possible to make S cuts such that each tree has diameter at most D.We will give a greedy algorithm which will compute the smallest num
阅读全文
posted @
2011-08-14 15:44
exponent
阅读(369)
推荐(0)
BZOJ2100
摘要:简单的最短路.要用堆优化的dijkstra.当复习了.code:/************************************************************** Problem: 2100 User: exponent Language: Pascal Result: Accepted Time:572 ms Memory:7356 kb ****************************************************************/ type edge=record v,w,n:longint; end; const maxm=
阅读全文
posted @
2011-08-14 13:31
exponent
阅读(289)
推荐(0)
BZOJ2101
摘要:首先O(N^2)的DP挺好想的.f[i,j]=sum[i,j]-min(f[i+1,j],f[i,j-1]).但题目把n出到5000,内存卡到64M,二维的状态存不下..其实,j这一维可以省掉.我们换个状态表示f[i,i+len]=sum[i,i+len]-min(f[i+1,i+len],f[i,i+len-1])然后循环这样写:for len=1 to n for i=1 to n-len.容易看出第二维可以省掉了.code:/************************************************************** Problem: 2101 User:
阅读全文
posted @
2011-08-14 13:02
exponent
阅读(246)
推荐(0)
BZOJ1776
摘要:简单的LCA.有一个结论,每个party中最远的点对中,必有一个点是该party中深度最大的点.然后记low[i]为第i个party的最深点,对每一个点查询dist(i,low[belong[i]]).belong就是第i个点属于哪个party.对于树上两点,dist(u,v)=depth(u)+depth(v)-2*depth(lca(u,v)).一开时用RMQ的LCA死活过不去.无奈,只好去学了tarjan的LCA.code:/************************************************************** Problem: 1776 User:
阅读全文
posted @
2011-08-14 10:45
exponent
阅读(367)
推荐(0)
BZOJ1601
摘要:我们新建一个0号点,作为水库的水源,到每个点的费用就是wi.注意到每个点的水源只有一个,所以最后答案是一棵树.显然是最小生成树了.code:/************************************************************** Problem: 1601 User: exponent Language: Pascal Result: Accepted Time:100 ms Memory:584 kb ****************************************************************/ const maxn=
阅读全文
posted @
2011-08-13 20:55
exponent
阅读(340)
推荐(0)
BZOJ1180
摘要:水题.对于最后的方案,表达式必然是下面这个样子的:(Xa1-Xb1)+(Ya1-Yb1)+(Xa2-Xb2)+(Ya2-Yb2)+...+(Xan-Xbn)+(Yan-Ybn)去掉括号,就等于|∑Xai-∑Xbi|+|∑Yai-∑Ybi| (1<=i<=n)读入完就出解了.code:/************************************************************** Problem: 1108 User: exponent Language: Pascal Result: Accepted Time:908 ms Memory:224 kb
阅读全文
posted @
2011-08-13 18:50
exponent
阅读(240)
推荐(0)
BZOJ2274
摘要:f[i]=∑f[j] (sum[j]<=sum[i]).sum为前缀和.裸的DP是O(N^2)的,其实我们要找的j只需满足sum[j]<=sum[i],然后求和.而树状数组天生就是干这个的.范围大,离散化一下就好了.code:/************************************************************** Problem: 2274 User: exponent Language: Pascal Result: Accepted Time:140 ms Memory:2568 kb ***************************
阅读全文
posted @
2011-08-13 17:20
exponent
阅读(317)
推荐(0)
BZOJ1096
摘要:CEOI2004Two的加强版.code:/************************************************************** Problem: 1096 User: exponent Language: Pascal Result: Accepted Time:6220 ms Memory:51008 kb ****************************************************************/ const oo=1e100; maxn=1000001; var f,x,p,c,sum,cost:array[
阅读全文
posted @
2011-08-13 16:41
exponent
阅读(413)
推荐(0)
POJ3045
摘要:题意:N头牛叠罗汉,每头牛有个体重Wi,力气Si.一头牛要承担的风险为所有在它上面的牛的体重之和-它的力气.求一个方案使得风险最大的牛的风险值最小.分析:对于相邻的两头牛,它们交换位置不影响其他的任何牛,只改变这两头牛的风险值.记sum为这两头牛上面的牛的体重总和.i在j上面Riski=sum-siRiskj=sum+wi-sj交换位置Riski'=sum+wj-siRiskj'=sum-sj方案1优于方案2,则max{Riski,Riskj}<max{Riski',Riskj'}而Riskj>Riskj'所以Riski'>ma
阅读全文
posted @
2011-08-13 14:28
exponent
阅读(876)
推荐(0)
POJ3132
摘要:题意:求将N分成K个不同质数的和的方案数.分析:筛法,然后直接背包之~~.code:const MAX=1200; maxn=1200; maxk=15;var Prime:array[0..MAX] of longint; P:array[0..MAX] of boolean; f:array[0..maxn,0..maxk] of longint; size,n,k,i,j,o,tmp:longint; procedure GetPrime; begin size:=0; fillchar(P,sizeof(P),0); for i:=2 to MAX do begin if not P[
阅读全文
posted @
2011-08-13 14:07
exponent
阅读(286)
推荐(0)
POJ3042
摘要:基本同RQNOJ的POWER.见我写的解题报告:http://www.cnblogs.com/exponent/archive/2011/08/08/2130723.htmlcode:const oo=1000000000000000;var f:array[0..1010,0..1010,0..1] of int64; g:array[0..1010,0..1010] of longint; d:array[0..1010] of longint; n,i,j,l,p:longint; flag:boolean; procedure sort(l,r:longint); var i,j,mi
阅读全文
posted @
2011-08-13 14:01
exponent
阅读(317)
推荐(0)
POJ3021
摘要:题意:给出M,S,和M对ai,bi.选出最少对的ai,bi,使得(∑ai)^2+(∑bi)^2=s^2.分析:背包.f[i,j]表示构成∑ai=i,∑bi=j的最少对数.(很少人做的水题)code:const oo=16843009;var f:array[0..310,0..310] of longint; a,b:array[0..50] of longint; n,m,s,d,o,i,j,k,ans:longint; function min(a,b:longint):longint; begin if a>b then exit(b); exit(a); end;begin re
阅读全文
posted @
2011-08-13 13:59
exponent
阅读(224)
推荐(0)
POJ2992
摘要:题意:求C(N,M)的约数个数.分析:暴力分解质因数会TLE.所以先预处理.记cnt[i,j]为i的阶乘中含第j个质数的个数(这样做要先筛素数).然后C(N,M)=N!/(M!*(N-M)!)中含第i个质数的个数就是cnt[n,i]-cnt[m,i]-cnt[n-m,i].这样就OK了(刷到了pascal的rank1).code:const MAX=440;var Prime:array[0..MAX] of longint; v:array[0..MAX] of boolean; cnt:array[0..max,0..100] of longint; size,n,m,i,j,num,tm
阅读全文
posted @
2011-08-13 13:54
exponent
阅读(481)
推荐(0)
POJ2773
摘要:题意:求第K个和M互质的数.分析:求一个数和多少个数互质可以用容斥原理,二分一个数验证是不是第K个即可(16MS).(另一种用欧拉函数的算法更快.)code:var p,c:array[0..10000] of longint; prime:array[0..100] of longint; v:array[0..1000001] of boolean; u:array[0..100] of boolean; m,n,k,i,nx,num:longint; l,r,mid,t:int64; procedure make(k,num:longint); var o:longint; begin
阅读全文
posted @
2011-08-13 13:48
exponent
阅读(735)
推荐(0)
POJ2585
摘要:题意:一个3*3的矩形可以用若干个2*2的矩形去覆盖,现在给出一个最终的图,求它是否合法.分析:就是拓扑排序.code:const yes='THESE WINDOWS ARE CLEAN'; no='THESE WINDOWS ARE BROKEN';var sta:array[1..9,0..1] of longint=((1,1),(1,2),(1,3), (2,1),(2,2),(2,3), (3,1),(3,2),(3,3)); map:array[0..10,0..10] of longint; link:array[0..10,0..10] of
阅读全文
posted @
2011-08-13 13:38
exponent
阅读(321)
推荐(0)
POJ2689
摘要:题意:求[L,U]区间内相差最大和最小的两对素数.(1<=L<U<=2,147,483,647,U-L<=1000000)分析:先筛出sqrt(maxlongint)范围内的素数,再用这些素数去筛L~U范围内的素数.code:const MAXNUM=50000; MAXN=1000001; MAXM=200000; oo=1000000000;var Prime:array[0..MAXNUM] of longint; P:array[0..MAXNUM] of boolean; d:array[0..MAXN] of boolean; px:array[0..MAX
阅读全文
posted @
2011-08-13 13:31
exponent
阅读(803)
推荐(0)
POJ2480
摘要:题意:Given an integer N(1<N<2^31),you are to calculate ∑gcd(i, N) 1<=i<=N.分析:数论题的魅力就在于此,一道题就一句简单的描述.显然,最后的答案肯定是由N的约数组成的,于是我们试着统计每个约数被用了几次.对于N的一个约数D,有多少个数与N的gcd是D呢?答案是φ(N/D).于是ans=∑φ(N/D)*D==∑φ(D)*(N/D). (D为N的约数)效率为O(sqrt(N)).code:var p,cnt:array[0..15] of longint; n,m,num,i:longint; tmp,an
阅读全文
posted @
2011-08-13 13:18
exponent
阅读(355)
推荐(0)
POJ2479
摘要:题意:求两段不相交的连续子序列的和的最大值.如下:水题,以前刚学线段树的时候写的,想到可以用线段树,一激动写了NlogN的.其实可以O(N)的.code(600多MS,勿看):type node=record l,r,num:longint;end;const oo=600000000; maxn=51000;var f1,f2,a:array[0..51000] of longint; t:array[0..maxn*5] of node; datanum,d,n,s,ans,i,max1,max2:longint; function max(a,b:longint):longint; be
阅读全文
posted @
2011-08-13 12:42
exponent
阅读(1551)
推荐(0)
POJ2465
摘要:题意:有一辆车要从起点0,到终点L处,中间有若干个加油站.给出车的油箱容量200,每行驶1km耗油1L.给出加油站的坐标,以及每个加油站的油价.一开始油箱里有100L的油,到达终点时必须还有100L的油,求最少花多少钱在加油上.分析:DP.对于到达终点时必须还有100L的油这个问题,只要将终点放远100米,设置为油价为0的加油站即可.F[i,j]表示到达第i个加油站有油j升的最优值.到达一个加油站时,枚举加多少油就好了.code:var f:array[0..110,0..210] of longint; g:array[0..110,0..210] of boolean; d,p:array
阅读全文
posted @
2011-08-13 12:35
exponent
阅读(328)
推荐(0)
POJ2454
摘要:题意:给出3*k个数,要求将其分为3个长度为k的序列,使得至少有两个序列的和大于500*k.分析:贪心+随机化.首先排序将最小的前k个去掉,剩下的才最有可能满足题意.然后随机交换[k+1,2k]和[2*k+1,3k]这两个区间内的数,知道满足题意,然后输出.因为k只有60,直接暴力即可.code:type rectype=record n,p:longint;end;var c:array[0..181] of rectype; n,k,i,x,y:longint; procedure sort(l,r:longint); var i,j,mid:longint; begin i:=l; j:
阅读全文
posted @
2011-08-13 12:03
exponent
阅读(436)
推荐(0)
POJ2436
摘要:题意:有N头奶牛,D种疾病,已知每头奶牛都得了哪几种疾病.现在要选出尽可能多的奶牛,使得这些奶牛所带的疾病种类不大于K种,问最多能选几只.分析:D<=15,N<=1000,考虑暴力枚举疾病种类的组合,O(N)求出可以入选的奶牛数.因为有K的限制,枚举的复杂度最多为C(D,D/2)只有6000多.位运算优化下,居然79MS.code:var dis:array[0..1001] of longint; n,d,k,i,j,l,di,tmp,ans:longint; function lowbit(x:longint):longint; begin exit(x and (x xor
阅读全文
posted @
2011-08-12 17:32
exponent
阅读(212)
推荐(0)
POJ2392
摘要:题意:奶牛们要用K个不同类型的石头建太空电梯.每一种石头的高度为Hi,数量为Ci,且不能放在高于Ai的地方,求最高能建多高的太空电梯.分析:多重背包,数组标记.显然将ai小的放在下面会更优.所以先排序.code:const maxh=41000;var cnt:array[0..maxh] of longint; h,a,c:array[0..401] of longint; f:array[0..maxh] of boolean; n,i,j,k,tmp,ans:longint; procedure swap(var a,b:longint); var tmp:longint; begin
阅读全文
posted @
2011-08-12 17:16
exponent
阅读(597)
推荐(0)
POJ2366
摘要:题意:给出N个递增的数ai,M个递减的数bi.求是否存在一对ai,bj使得ai+bj=10000.分析:N<=50000,N^2效率一定不行了.看到a,b数列均单调,这可以加速.设置一个指针i指向a,j指向b.初始i=1,j=1.若ai+bj>10000,那么肯定bj+ai'(i'>i)都不等于10000,因为ai递增.所以j=j+1.同理,若ai+bj<10000,i=i+1.这个方法很有用,要记下.code(无聊地写了C++):#include<iostream>using namespace std;int a[51000],b[510
阅读全文
posted @
2011-08-12 16:55
exponent
阅读(422)
推荐(0)
POJ2356
摘要:题意:给出N个数(N<=10000),求是否可以找到连续的若干个数,使得他们的和为N的倍数.分析:首先根据抽屉原理,这个方案一定存在.边读边做,记录1~i的和模N的余数,如果这个数出现过,那么就可以输出方案了.code(0MS):var a,sum,bool:array[0..10001] of longint; n,i:longint; procedure print(l,r:longint); var o:longint; begin writeln(r-l+1); for o:=l to r do writeln(a[o]); halt; end;begin readln(n);
阅读全文
posted @
2011-08-12 16:47
exponent
阅读(305)
推荐(0)
POJ2353
摘要:题意:给出一个带权矩阵,一开始人在第1行,只能向下,左,右三个方向走,走到每一个点(i,j)都要支付a[i,j]的费用,求一条从第1行到第n行的最小费用路径.分析:DP,f[i,j]表示到(i,j)时的最优值.f[i,j]=min(f[i-1,j],f[i,j+1],f[i,j-1]).用d[i,j]记录走的方向.注意更新顺序.code:const oo=2100000000;var f,cost,d:array[0..110,0..510] of longint; res:array[0..50000] of longint; up,left,right,ans:longint; n,m,i
阅读全文
posted @
2011-08-12 16:37
exponent
阅读(478)
推荐(0)
POJ2253
摘要:题意:给出一个无向图,求一条1~2的路径使得路径上的最大边权最小.分析:dijkstra变形,将更新距离的过程改为取最大值即可.code:const maxn=201;var d:array[0..maxn,0..maxn] of extended; x,y:array[0..maxn] of longint; v:array[0..maxn] of boolean; n,s,t,i,j,p,casenum:longint; minx:extended; function calc(a,b:longint):extended; begin calc:=sqrt(sqr(x[a]-x[b])+s
阅读全文
posted @
2011-08-12 16:31
exponent
阅读(1139)
推荐(0)
POJ2231
摘要:题意:给出N个数,求形成的N^2对数的差的绝对值之和.(N<=10000)分析:N^2做肯定不行.我们看ai这个数与其他数对答案的贡献.sum=∑|ai-aj|.去掉绝对值,如果有k个数比ai小,那么ai为sum贡献了k个+ai,n-k-1个-ai.然后算法就清晰了,排序,O(N)地扫一遍统计答案.code:var a:array[0..10001] of longint; n,i,j:longint; ans,now:int64; procedure sort(l,r:longint); var i,j,mid,temp:longint; begin i:=l; j:=r; mid:=
阅读全文
posted @
2011-08-12 16:26
exponent
阅读(519)
推荐(0)
POJ2137
摘要:题意:给出N头牛,每头牛有若干个喜欢的点(x,y).求一个方案,使得每头牛都可以在自己喜欢的位置上,且将这N头牛以1~N的顺序连成一个环(如1-2-3-4-1)所花费的绳子长度最短.分析:DP,f[i,j]表示将第i头牛绑在它喜欢的第j个位置的最优值.因为要首尾相连,干脆就枚举1号牛绑的位置.code:type cow=record x,y:longint;end;const oo=100000000;var f:array[0..101,0..41] of extended; c:array[0..101,0..41] of cow; p:array[0..101] of longint;
阅读全文
posted @
2011-08-12 16:11
exponent
阅读(256)
推荐(0)
POJ2111
摘要:题意:给出一个带权矩阵,一条合法路径应满足下列条件:1.跳跃方式为中国象棋中的马步.2.每步只能跳往权值比上一步大的格子.现在求最长的合法路径,多种方案时输出字典序最小的.分析:POJ1088滑雪的改进版.用f[i,j]表示从(i,j)出发的最长路径.记忆化搜索,同时更新最优方案.code:type recnode=record x,y:longint;end;var fx:array[1..8,0..1] of longint=((-2,-1),(-1,-2),(1,-2),(2,-1) ,(2,1),(1,2),(-1,2),(-2,1)); f,num:array[0..400,0..4
阅读全文
posted @
2011-08-12 16:02
exponent
阅读(283)
推荐(0)
POJ2110
摘要:题意:给定一个矩阵,从左上角到右下角,使走过的路径中数字的最大值最小值之差最小,问差最小是多少.分析:二分枚举差值,枚举下界,bfs判定可行性.code:type mapnode=record x,y:longint;end;var fx:array[1..4,0..1] of longint=((0,1),(0,-1),(-1,0),(1,0)); tall:array[0..101,0..101] of longint; vis:array[0..101,0..101] of boolean; q:array[0..10000] of mapnode; n,i,j,l,r,mid,maxh
阅读全文
posted @
2011-08-12 15:54
exponent
阅读(248)
推荐(0)
POJ1948
摘要:题意:给出N(N<=40)根木棍,每根长度为Li(Li<=40),要用完所有的木棍构成面积最大的三角形,求最大面积.分析:用can[i,j,k]表示用前i根木棍,组成两条长为j,k的长木棍是否可能.can[i,j,k]=can[i,j,k] or can[i-1,j-l[i],k] or can[i-1,j,k-l[i]] or can[i-1,j,k].最后枚举两条边,求出第三条边,用海伦公式求出面积即可.这是比较水的算法,跑了844MS..code:var can:array[0..40,0..800,0..800] of boolean; l:array[0..41] of
阅读全文
posted @
2011-08-12 15:48
exponent
阅读(515)
推荐(0)
POJ1947
摘要:题意:给出一棵树,问最少切断几条边可以得到有p个结点的子树.分析:明显的树形DP.f[i,j]表示以第i个节点为根的子树保留j个节点最少需要去掉几条边.f[i,j]=min{f[i,j-k]+f[s,k]-2} (s是i的儿子)ans=min{f[i,p]}code:type edge=record v,n:longint;end;const root=1; oo=10000;var e:array[0..400] of edge; vis:array[0..200] of boolean; h,s:array[0..200] of longint; t,f:array[0..200,0..2
阅读全文
posted @
2011-08-12 15:40
exponent
阅读(1174)
推荐(0)
POJ1949
摘要:题意:有n个任务,第i个任务需要时间ti来完成,并且第i个任务必须在它前面的某些任务完成之后才能开始.给你任务信息,问你最短需要多少时间来完成任务.分析:题目给出的数据已经拓扑有序了,直接DP.f[i]表示第i个任务完成的最短时间,f[i]=max{f[j]}+ti (j必须在i之前完成)ans=max{f[i]}.code:var f:array[0..10001] of longint; n,i,j,k,t,p,ans,tmp:longint;begin readln(n); for i:=1 to n do begin read(t); read(k); tmp:=0; for j:=1
阅读全文
posted @
2011-08-12 15:35
exponent
阅读(291)
推荐(0)
动态规划优化_斜率优化
摘要:先来看一道题(HDU3507):题意:给出N个单词,每个单词有个非负权值Ci,将k个单词排在一行的费用为(∑Ci)^2+M.求最优方案,使得总费用最小.我们很容易得到一个O(N^2)的算法:s[i]表示前i个单词的权值和.先写个东西在这:所有元素非负的数组的前缀和值随下标增加单调递增.后面会用到.f[i]表示将前i个单词排版完毕后的最优值,f[i]=min{f[j]+(s[i]-s[j])^2+M}.但题目中N的范围是500000.这个算法明显不行.考虑如何优化.我们固定i,考虑它的两个一般决策点j,k(j<k).记g[pos]=f[pos]+(s[i]-s[pos])^2+M,即i从p
阅读全文
posted @
2011-08-11 14:14
exponent
阅读(2056)
推荐(2)
POJ1942
摘要:题意:一个N*M的网格,只能在网格的边上向上或向右走,求从左下角走到右上角的方案数.分析:一共要走N+M步,其中M步向右,N步向上.因此方案数即C(N+M,N).code:var n,m,max,o,ans:int64;begin while not eof do begin readln(n,m); if n+m=0 then halt; max:=n; if m>max then max:=m; ans:=1; o:=max+1; while o<=n+m do begin ans:=int64(ans)*int64(o) div int64(o-max); o:=o+1; e
阅读全文
posted @
2011-08-10 16:44
exponent
阅读(214)
推荐(0)
POJ1845
摘要:题意:求A^B的约数和mod 9901.(0 <= A,B <= 50000000)分析:记f(n)为n的约数和.求f(a^b) mod c.f(n)=∏(pi^(qi+1)-1)/(pi-1)pi为质因子,qi为质因子个数.(pi^(qi+1)-1)/(pi-1)=1+pi+pi^2+......+pi^qi转化为等比数列的和.可以用二分.例如:1+p+p^2+p^3+p^4=p^2+(1+p^3)(1+p)1+p+p^2+p^3+p^4+p^5=(1+p^3)(1+p+p^2)递归进行.code:const mo=9901;var p,q:array[0..20] of lon
阅读全文
posted @
2011-08-10 16:41
exponent
阅读(678)
推荐(0)
POJ1837
摘要:题意:给出N个挂钩,M个砝码,每个挂钩有一个权值,可正可负(相当于天平的左右边).求用M个砝码使天平平衡的方案数(砝码必须全用上).分析:f[i,j]表示用前i个砝码,左右差值为j的方案数.转移见代码.ans=f[m,0].code:const range=8000; r=7500;var f:array[0..21,-range..range] of longint; n,m,k,i,j:longint; p,w:array[0..21] of longint;begin readln(n,m); for i:=1 to n do read(p[i]); readln; for i:=1 t
阅读全文
posted @
2011-08-10 16:37
exponent
阅读(220)
推荐(0)
POJ1787
摘要:题意:现在有4种面值的货币,给出每种货币的数量,求是否能用这4种货币组成总额为P.若存在,则输出该方案.分析:多重背包,数组标记,记录路径.code:type rec=record fa,tot:longint;end;var a:array[1..4] of longint=(1,5,10,25); c,ans:array[1..4] of longint; f:array[0..10001] of boolean; count:array[0..10001] of longint; path:array[0..10001] of rec; i,j,m,cur:longint; functi
阅读全文
posted @
2011-08-10 16:13
exponent
阅读(383)
推荐(0)
POJ1717
摘要:题意:题目给出两列数,为了使两列数的和之间的差距(gap)变小,可以交换对应位置的数字,求出当gap最小的时候,最少的交换次数.分析:用f[i,j]表示处理完前i对数,差为j的最少交换次数.注意到f[i]只跟f[i-1]有关,可以用滚动数组.转移类似于填表.code:var a,b,d:array[0..1001] of longint; f:array[0..1,-6000..6000] of longint; g:array[0..1,-6000..6000] of boolean; n,i,j,pre,now:longint; function min(a,b:longint):long
阅读全文
posted @
2011-08-10 16:10
exponent
阅读(788)
推荐(1)
POJ1692
摘要:var f:array[0..101,0..101] of longint; a,b:array[0..101] of longint; dnum,dx,n1,n2,i,j,p,q:longint; function max(a,b:longint):longint; begin if a>b then exit(a); exit(b); end;begin readln(dnum); for dx:=1 to dnum do begin fillchar(f,sizeof(f),0); readln(n1,n2); for i:=1 to n1 do read(a[i]); readl
阅读全文
posted @
2011-08-10 16:04
exponent
阅读(307)
推荐(0)
POJ1679
摘要:题意:判断最小生成树是否唯一.分析:先求出一棵最小生成树,记下最小权值为W0.然后枚举树上的每条边,去掉以后再求一次最小生成树,只要出现权值等于W0,那么最小生成树一定不唯一.因为范围小,所以这样的算法可以过.还有更优的算法.code:type node=record u,v,w:longint; bo:boolean;end;const oo=100000000;var e:array[0..11000] of node; mst,f:array[0..110] of longint; min,d,datanum,n,m,o,now:longint; bool:boolean; proced
阅读全文
posted @
2011-08-10 16:00
exponent
阅读(870)
推荐(0)
POJ1659
摘要:题意:中文描述.分析:havel定理的应用.havel定理的简介:给定一个非负整数序列{d1,d2,...dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化。进一步,若图为简单图,则称此序列可简单图化。可图化的判定比较简单:d1+d2+...dn=0(mod2)。关于具体图的构造,我们可以简单地把奇数度的点配对,剩下的全部搞成自环。可简单图化的判定,有一个Havel定理,是说: 我们把序列排成不增序,即d1>=d2>=...>=dn,则d可简单图化当且仅当d'=(d2-1, d3-1, ... d(d1+1)-1, d(d1+2), d(d1+
阅读全文
posted @
2011-08-10 15:53
exponent
阅读(823)
推荐(0)
POJ1655
摘要:题意:给定一棵树,问删除哪个点,使余下的各个子树结点个数的最大值最小.分析:先DFS一次,求出以每个节点为根的子树的节点个数s[i].设f[i]表示去掉i后,余下的各个子树结点个数的最大值.f[i]=max(n-s[i],max{s[j]}). (j为i的儿子).这样再DFS一次,求出max{f[i]}即为答案.code:type edge=record v,n:longint;end;const maxn=20001; oo=100000000;var e:array[0..maxn*2] of edge; h,s,f:array[0..maxn] of longint; vis:array
阅读全文
posted @
2011-08-10 15:49
exponent
阅读(879)
推荐(0)
POJ1631
摘要:题意:就是求最长上升子序列.分析:N^2DP会超时,用NlogN的算法.code:var a:array[0..40001] of longint; datanum,d,n,i,p,top,num:longint; procedure find(key,l,r:longint); var mid:longint; begin if l=r then begin p:=l; exit; end; mid:=(l+r)>>1; if a[mid]>key then find(key,l,mid) else find(key,mid+1,r); end;begin readln(d
阅读全文
posted @
2011-08-10 15:43
exponent
阅读(147)
推荐(0)
POJ1611
摘要:题意:N组学生.一个学生能同时加入不同的组.同一组的学生会同时感染病毒.现在0号的学生感染了病毒,问一共有多少个人感染病毒.分析:并查集.将同一组的学生合并.这样有交集的组也被合并.最后只要求出0号所在的集合大小即可.code:var f:array[0..30000] of longint; n,m,i,j,k,u,v,fu,fv,fx,ans:longint; function getf(x:longint):longint; begin if f[x]<>x then f[x]:=getf(f[x]); exit(f[x]); end;begin while not seek
阅读全文
posted @
2011-08-10 15:41
exponent
阅读(242)
推荐(0)
POJ1423
摘要:题意:求N阶乘的位数.分析:用斯特林近似公式求阶乘.一个数Num的位数=[lg(Num)]+1.斯特林近似公式:N!≈(2*pi*N)^0.5*(n/e)^n.于是N!的位数=ln((2*pi*N)^0.5*(n/e)^n)/ln(2).用一些对数变换防止溢出.code:const e=2.71828182; pi=3.1415926; ln10=ln(10); lnpi=ln(pi); ln2=ln(2);var datanum,d,n:longint; ans1,ans2,lnn:extended;begin readln(datanum); for d:=1 to datanum do
阅读全文
posted @
2011-08-10 15:34
exponent
阅读(334)
推荐(0)
POJ1400
摘要:题意:将一个表达式化简,将多余的括号去掉.分析:先将表达式转为后缀表达式,再转回中缀表达式,这样多余的括号就去掉了.code:var snum:set of char; n,q:longint; s:ansistring; function grade(ch:char):longint; begin grade:=-1; case ch of '+':exit(1); '-':exit(1); '*':exit(2); '/':exit(2); '(':exit(0); end; end; function mid
阅读全文
posted @
2011-08-10 15:27
exponent
阅读(440)
推荐(0)
POJ1283
摘要:题意:整数划分问题,将整数N分为K份,每份都不为0.求方案数.分析:DP,f[i,j]表示整数I,分为J份的方案数.分两类进行转移:1.分出来的j份中没有含1的,f[i,j]=f[i-j,j].2.分出来的j分中含有1,f[i,j]=f[i-1,j-1];合起来f[i,j]=f[i-1,j-1]+f[i-j,j];特殊的f[i,i]=1.code:var f:array[0..201,0..201] of int64; n,k,i,j:longint;begin for i:=1 to 201 do f[i,i]:=1; for i:=2 to 201 do for j:=1 to i-1 d
阅读全文
posted @
2011-08-10 15:22
exponent
阅读(305)
推荐(0)
POJ1276
摘要:题意:现在需要价格总额为cash的钱,有n种面值的钱币,每种钱币的数目为n[i],面值为d[i],求在小于或等于所需价格总额的情况下所能组成的最大价值.分析:多重背包,数组标记.code:var f:array[0..120000] of boolean; count:array[0..120000] of longint; v,t:array[0..120] of longint; n,m,i,j,ans:longint;begin while not eof do begin read(m,n); if (n=0)and(m=0) then halt; fillchar(f,sizeof(
阅读全文
posted @
2011-08-10 15:05
exponent
阅读(286)
推荐(0)
POJ1252
摘要:题意:有6种面值的货币,保证最小面值是1.可加可减,求出分别组成1~100金额的最少货币数.并求出它们的平均值和最大值.分析:有负权的完全背包,下界开大,注意处理负权即可.code:const oo=33686018; maxn=20000;var datanum,d,o,i,j,ans,max:longint; a:array[1..6] of longint; f:array[0..maxn] of longint; function min(a,b:longint):longint; begin if a>b then exit(b); exit(a); end;begin rea
阅读全文
posted @
2011-08-10 15:02
exponent
阅读(424)
推荐(0)
POJ1195
摘要:题意:要求设计这样一个数据结构,支持下列操作1.add(x,y,a).对二维数组的第x行,第y列加上a.2.sum(l,b,r,t).求所有满足l<=x<=r,b<=y<=t,的数组元素的和.显然,二维树状数组满足这些要求.code:var c:array[0..1025,0..1025] of longint; opt,n,x,y,a,l,b,r,t:longint; function lowbit(i:longint):longint; begin lowbit:=i and (i xor (i-1)); end; procedure change(x0,y0,a:
阅读全文
posted @
2011-08-10 13:18
exponent
阅读(1175)
推荐(0)
POJ1160
摘要:题意:给出n个村庄的坐标,要求建m个邮局,使得所有村庄到离其最近的邮局的距离之和最小.分析:DP.f[i,j]表示前i个村庄建j个邮局的最小代价.f[i,j]=min{f[k,j-1]+cost[k+1,i]}cost[l,r]表示在l,r之间建一个邮局,代价是多少.可以O(N^3)地预处理出来.总复杂度为O(N^3).code:const oo=100000000;var f,dis:array[0..310,0..310] of longint; p:array[0..310] of longint; n,m,i,j,k,now,mid:longint; function min(a,b:
阅读全文
posted @
2011-08-10 13:12
exponent
阅读(736)
推荐(0)
POJ1141
摘要:题意:求最少添加多少个括号可以使得原序列成为合法的括号序列,并输出这个合法的括号序列.分析:DP,记录路径.用f[i,j]表示i~j之间的序列至少添加多少个括号.显然,f[i,i]=1.1.f[i,j]=f[i+1,j-1] (s[i],s[j]可以配对)d[i,j]=-1;2.f[i,j]=min{f[i,k]+f[k+1,j]} (i<=k<=j-1)d[i,j]=k;(k是f[i,j]的决策点)方案输出见代码.code:const oo=10000000;var f,d:array[0..110,0..110] of longint; s:array[0..110] of c
阅读全文
posted @
2011-08-10 13:02
exponent
阅读(496)
推荐(0)
POJ1125
摘要:题意:对于一个点i,设f(i)=max{mindis[i,j]} (j≠i).其中mindis是各个点对之间的最短路.求min{f(i)} (1<=i<=n).分析:floyd求出最短路即可.code:var person,time,n,i,j,k,p,min,max,mini,minperson:longint; map:array[0..110,0..110] of longint; f:boolean;begin readln(n); while n<>0 do begin fillchar(map,sizeof(map),1); for i:=1 to n do
阅读全文
posted @
2011-08-10 12:54
exponent
阅读(315)
推荐(0)
POJ1061
摘要:题意:中文描述的.分析:设青蛙跳了t次,那么就有(x+mt)-(y+nt)=p*L.即x-y+(m-n)t=p*L,即(m-n)*t≡(y-x) (mod L).这个线性同余方程有解当且仅当gcd(m-n,L)|(y-x).令a=m-n,b=L,c=y-x.用扩展欧几里得解方程ax+by=c.可以求出原方程的一个解.如何求最小正整数解呢?假设我们已经得到一个x0,令d=gcd(m-n,L),那么所有解可以表示为x=x0+k*L/d.设L'=L/d.Xmin=(x0 mod L'+L') mod L'.code:var x,y,n,m,l,a,b,c,d,xx,y
阅读全文
posted @
2011-08-10 12:47
exponent
阅读(336)
推荐(0)
POJ1050
摘要:题意:最大子矩阵.分析:枚举矩形的上下边界,将权值纵向累加到一列上,求最大连续子序列和.复杂度O(N^3).code:const oo=100000000;var a,sum:array[0..110,0..110] of longint; s:array[0..110] of longint; n,i,j,k:longint; ans,max,now,maxnow:longint; function maxx(a,b:longint):longint; begin if a>b then exit(a); exit(b); end;begin readln(n); for i:=1 t
阅读全文
posted @
2011-08-10 12:19
exponent
阅读(320)
推荐(0)
POJ1014
摘要:题意:已知有单价分别为1..6的大理石各num[1..6]块,大理石的总数不超过20000,现要将他们分成两部分,使得两部分的总价相同,求解是否可以实现.分析:多重背包问题.先求出总价值sum,若sum为奇数则一定不可能.否则用数组标记算法验证是否可以得到sum div 2的价值.code:var f:array[0..200000] of boolean; count:array[0..200000] of longint; tot,sum,i,j:longint; a:array[0..10] of longint;begin while not eof do begin inc(tot)
阅读全文
posted @
2011-08-10 12:16
exponent
阅读(269)
推荐(0)
图论基础_LCA
摘要:LCA,即LeastCommonAncestor,最近公共祖先.在上图中,2和3的LCA是1,3和4的LCA也是1.求LCA的算法怎么样的呢?先来看张图.欧拉序列F:1 2 5 2 6 2 1 3 1 4 1深度序列B:0 1 2 1 2 1 0 1 0 1 0POS:1 2 8 10 3 5欧拉序列即对树进行DFS过程中得到的DFS序列,深度是欧拉序列中对应的各个节点在树中的深度,POS是各个节点在DFS序列中第一次出现的位置.如3第一次出现是在欧拉序列的第8个,所以POS(3)=8.根据DFS的性质,对于两结点u、v,从pos(u)遍历到pos(v)的过程中经过LCA(u, v)有且仅有一
阅读全文
posted @
2011-08-09 15:13
exponent
阅读(747)
推荐(0)
数论基础_欧拉函数
摘要:欧拉函数在OI中是个非常重要的东西,不知道的话会吃大亏的.欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数.对φ(N)的值,我们可以通俗地理解为小于N且与N互质的数的个数.欧拉函数的一些性质:1.欧拉函数是积性函数,但不是完全积性函数,即φ(mn)=φ(n)*φ(m)只在(n,m)=1时成立.2.对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn. φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn).3.除了N=2,φ(N)都是偶数.4.设N为正整数,∑φ(d)=N (d|N).根据性质2,我们可以在O(sqrt(n))的时间内求出一个数的欧拉
阅读全文
posted @
2011-08-09 11:04
exponent
阅读(7690)
推荐(0)
数论基础_素数相关
摘要:1.素数判定普通的算法即O(sqrt(N))的试除法,高级些的Miller_Rabin素数测试.但NOIP似乎用不着Miller_Rabin,试除法又非常简单,就不在这里写了.2.求素数筛法是比较常见的方法.埃拉托色尼斯筛法可以对付一般的题目了.但我想写写线性筛法.先给code:const MAX=1000000;var Prime:array[0..MAX] of longint; v:array[0..MAX] of boolean; procedure GetPrime; var i,j,tmp,size:longint; begin ...
阅读全文
posted @
2011-08-09 10:38
exponent
阅读(344)
推荐(0)
数论基础_中国剩余定理
摘要:给出一个线性同余方程组 x≡b1(mod m1) x≡b2(mod m2) x≡b3(mod m3) ...... x≡bn(mod mn)其中m1,m2,...,mn两两互素,求x.令M=m1*m2*m3*...*mn.Mi=M/mi.Mi'Mi≡1 (mod mi)用扩展欧几里得算法求出Mi关于mi的乘法逆元Mi'.x=∑Mi'Mibi mod Mcode:var p,q,r:array[0..10000] of longint; n,i,m,xx,yy,ans:longint; function exgcd(a,b:longint; var x,y:longint
阅读全文
posted @
2011-08-09 10:17
exponent
阅读(520)
推荐(0)
数论基础_扩展欧几里得算法
摘要:扩展欧几里得算法是用来求解形如ax+by=c的方程的.令d=gcd(a,b),若d不整除c则方程无解.我们先考虑这个方程:ax+by=d∵gcd(a,b)=gcd(b,a mod b)∴d=ax+by=bx'+(a mod b)y'=bx'+(a-[a/b]b)y'=ay'+b(x'-[a/b]y')令x=y' y=x'-[a/b]y'当b=0时,d=a=ax+by得x=1,y=0.求出ax+by=d的一组解x',y'后,由(c/d)ax'+(c/d)by'=(c/d)d即可得到ax
阅读全文
posted @
2011-08-09 10:11
exponent
阅读(458)
推荐(0)
数论基础_线性同余方程
摘要:定理1:如果a,b,m,n是整数,且c|a,c|b,则c|(ma+nb).证明:令a=ce,b=cf,则ma+nb=emc+fnc=c(em+fn).得证形如ax+by=c的方程,其中a,b,c为整数,被称为关于两个变量的线性丢番图方程.定理2:设a,b是整数且d=(a,b),如果d|c,那么存在无穷多个整数解,否则没有整数解.证明:由定理1,知d|(ax+by).因此若d不整除c,则方程无整数解.形如ax≡b (mod m)的同余式称为一元线性同余方程.定理3:设a,b和m是整数,m>0,(a,m)=d,若d|b则ax≡b (mod m)恰有d个模m不同余的解,否则无整数解.证明:ax
阅读全文
posted @
2011-08-09 10:06
exponent
阅读(753)
推荐(0)
数论基础_欧几里德算法
摘要:定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0) 证明:a可以表示成a=kb+r,则r=a mod b 假设d是a,b的一个公约数,则有 d|a,d|b,而r=a-kb,因此d|r 因此d也是(b,a mod b)的公约数 因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证摘自百度百科:http://baike.baidu.com/view/1241014.htmcode: function gcd(a,b:longint):longint; begin if b...
阅读全文
posted @
2011-08-09 09:37
exponent
阅读(224)
推荐(0)
RQNOJ412_POWER
摘要:题目描述多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。多瑞卡每晚到早晨5点钟都在晚会上,然后他开始关灯。开始时,他站在某一盏路灯的旁边。每盏灯都有一个给定功率的电灯泡,因为多端卡有着自觉的节能意识,他希望在耗能总数最少的情况下将所有的灯关掉。多端卡因为太累了,所以只能以1m/s的速度行走。关灯不需要花费额外的时间,因为当他通过时就能将灯关掉。编写程序,计算在给定路灯设置,灯泡功率以及多端卡的起始位置的情况下关掉所有的灯需耗费的最小能量。输入格式输入文件的第一行包含一个整数N,2≤N≤1000,表示该村庄路灯的数量。第二行包含一个整数
阅读全文
posted @
2011-08-08 11:18
exponent
阅读(931)
推荐(2)
RQNOJ356_mty的格斗
摘要:题目描述'恩 ~~这个和这个也是朋友.把他们放在一起......哇!终于完成了'mty费了好大劲,终于找出了一支最为庞大的军队.fyc很高兴,立马出征与人fight.mty万万没想到fyc竟然把他也叫去了.偶像的命令不可违抗,mty只好跟着出发了.两军交战采用一对一单挑的形式.mty一上来就遇到了一个对手.此人身高2米12,头大,腿粗.....这个人fight崇尚防守反击,他要等mty出手,漏出破绽才进攻,且只进攻一次.现在mty有p个招数,每招都会给对方造成伤害,也会让对手有可趁之机来攻击自己,造成伤害.mty进攻一次需1秒,而他的对手出招很快,进攻时间可以忽略不计.mty想
阅读全文
posted @
2011-08-08 11:10
exponent
阅读(254)
推荐(0)
RQNOJ273_马棚问题
摘要:题目描述每天,小明和他的马外出,然后他们一边跑一边玩耍。当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚。他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他的马做过多的移动。因此他想了一个办法:将马按照顺序放在马棚中,后面的马放的马棚的序号不会大于前面的马放的马棚的序号。而且,他不想他的K个马棚中任何一个空置,也不想任何一匹马在外面。已知共有黑、白两种马,而且它们相处得并不十分融洽。如果有i个白马和j个黑马在一个马棚中,那么这个马棚的不愉快系数将是i*j。所有k个马棚不愉快系数的和就是系数总和。确定一种方法把n匹马放入k个马棚,使得系数总和最小。输入格式输入:在第一行
阅读全文
posted @
2011-08-08 10:58
exponent
阅读(473)
推荐(0)
RQNOJ225_书本整理
摘要:题目描述Frank是一个非常喜爱整洁的人。他有一大堆书和一个书架,想要把书放在书架上。书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上。但是Frank发现,由于很多书的宽度不同,所以书看起来还是非常不整齐。于是他决定从中拿掉k本书,使得书架可以看起来整齐一点。书架的不整齐度是这样定义的:每两本书宽度的差的绝对值的和。例如有4本书:1x25x32x43x1那么Frank将其排列整齐后是:1x22x43x15x3不整齐度就是2+3+2=7已知每本书的高度都不一样,请你求出去掉k本书后的最小的不整齐度。输入格式第一行两个数字n和k,代表书有几本,从中去掉几本。(1<=n<
阅读全文
posted @
2011-08-08 10:50
exponent
阅读(330)
推荐(0)
RQNOJ117_最佳课题选择
摘要:题目描述NaCN_JDavidQ要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择。由于课题数有限,NaCN_JDavidQ不得不重复选择一些课题。完成不同课题的论文所花的时间不同。具体地说,对于某个课题i,若NaCN_JDavidQ计划一共写x篇论文,则完成该课题的论文总共需要花费Ai*x^Bi个单位时间(系数Ai和指数Bi均为正整数)。给定与每一个课题相对应的Ai和Bi的值,请帮助NaCN_JDavidQ计算出如何选择论文的课题使得他可以花费最少的时间完成这n篇论文。输入格式第一行有两个用空格隔开的正整数n和m,分别代表需要完成的论文数和可供选择的课题数。 以下m行每行有两个用空格
阅读全文
posted @
2011-08-08 10:32
exponent
阅读(337)
推荐(0)
RQNOJ107_鹰蛋实验
摘要:题目描述在ural大学的一个教授的别墅上有一鹰巢。教授对这个鹰巢很感兴趣。经过仔细观察,他发现鹰巢中有若干枚蛋。于是他想利用这些蛋做一个试验。测试一下蛋的坚固程度。这些蛋应该是具有相同的坚硬度。存在一个非负整数E,如果从楼的第E层往下扔蛋,但不会破,但如果从第E+1层(包括高于E+1层)扔,蛋就会破。你要做一组试验,来找出E。最简单的方法是一层层试。但是你有多个蛋是,不必用笨方法,可以用更少的次数找出E。注意这里的次数都是指对你的方法的最坏情况且蛋破了就不能再用,还有E可以取0。如果实验到了最高层蛋还不破,则认为E取最高层的层数。输入格式一行,蛋的个数n和楼的层数k.n,k<=1000。
阅读全文
posted @
2011-08-08 10:24
exponent
阅读(2180)
推荐(0)
RQNOJ106_最大加权矩形
摘要:题目描述给定一个正整数n(n<=100),然后输入一个N*N矩阵。求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大 。矩阵的每个元素属于[-127,127]例:0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2在左下角9 2-4 1-1 8和为15.输入格式第一行:n,接下来是n行n列的矩阵。输出格式最大矩形(子矩阵)的和。样例输入40 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2样例输出15//-----------------------------------
阅读全文
posted @
2011-08-08 10:04
exponent
阅读(700)
推荐(0)
RQNOJ103_最大利润
摘要:题目描述 X市的一家化工厂最近购买了一批重量为n克的化学原料。这种原料可以进行A,B两种化学实验,每种实验有其固定的利润及损耗率。已知,1克的原料做 A实验可得利润a元,但有p的损耗; 同样,1 克的原料做B实验可得利润b元,但有q的损耗。 一次全体实验定义为:将手头现有的全部原料一部分做A实验,另一部分做B实验。其利润为做A 实验的总利润与做B实验的总利润之和。 于是一个问题摆在面前,若化工厂准备做m次全体实验,那么如何安排每次实验,才能使得总利润最大呢?请你编程解决这个问题。输入格式输入文件仅1行,依次为: m, n,a,b,p,q其中n,m,a,b为整数,且0<m<=30,
阅读全文
posted @
2011-08-08 09:55
exponent
阅读(427)
推荐(0)
RQNOJ57_找啊找啊找GF
摘要:题目描述题目背景"找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见.""诶,别再见啊..."七夕...七夕...七夕这个日子,对于sqybi这种单身的菜鸟来说是多么的痛苦...虽然他听着这首叫做"找啊找啊找GF"的歌,他还是很痛苦.为了避免这种痛苦,sqybi决定要给自己找点事情干.他去找到了七夕模拟赛的负责人zmc MM,让她给自己一个出题的任务.经过几天的死缠烂打,zmc MM终于同意了.但是,拿到这个任务的sqybi发现,原来出题比单身更让人感到无聊-_-....所以,他决定了,要在出题的同时去办另一件能够使
阅读全文
posted @
2011-08-08 09:37
exponent
阅读(304)
推荐(0)
图论基础_最小生成树
摘要:1.Prim算法(POJ2560)const maxn=101;var x,y,mindis:array[0..maxn] of extended; dis:array[0..maxn,0..maxn] of extended; vis:array[0..maxn] of boolean; n,i,j:longint; function calc(a,b:longint):extended; begin calc:=sqrt(sqr(x[a]-x[b])+sqr(y[a]-y[b])); end; procedure prim(root:longint); var i,j,k:longint;
阅读全文
posted @
2011-08-07 20:18
exponent
阅读(255)
推荐(0)
图论基础_最短路
摘要:1.Dijkstra算法.(O(N^2)的算法就不写了,贴个堆优化的Dijkstra.)type node=record u,d:longint;end;const maxn=30001; maxm=400001; oo=1<<30;var n,m,s,t,cnt,size,u,v,w,i,j:longint; e:array[0..maxm] of record v,n,w:longint; end; l,d:array[0..maxn]...
阅读全文
posted @
2011-08-07 20:11
exponent
阅读(285)
推荐(0)
状压动规_(POJ2817)
摘要:题意:给出N(N<=10)个字符串(length<=10),定义两个串a,b之间的公共序列长度为将a,b对齐后,相同位置上相同字母的个数,a,b的最长公共序列长度自然是相同字母数的最大值,如a='abcd',b='bed',a,b的最长公共序列长度为2.如要求将N个字符串排列,使得相邻的N-1对字符串的最长公共序列长度和最大.(出题人不负责,N怎么也应该有20,这题暴搜可以过.)讲讲状压的做法.f[i,j]中j(二进制)表示哪些字符串已选,i表示最右边的是哪一个字符串.转移时,枚举j中的一个不为0的位,去掉,成为j',i'表示j
阅读全文
posted @
2011-08-07 17:29
exponent
阅读(571)
推荐(0)
状压动规_(POJ2411)
摘要:题意很简单,用1*2的小矩形不重叠也不漏地铺满n*m的矩形,问方案数.解法自然是状态压缩DP.考虑每一行,用一个二进制串表示其状态,若第i位为1则表示在这一行的第i列竖放一个矩形,它占用了这一行和下一行的第i列(下一行的第i列为0).其余的0表示横放的矩形.具体做法:用f[i,j]表示第i行放置方法为j(j是二进制数)的方案数.显然第一行的二进制串中不能出现连续的奇数个.对于第i行的二进制串now,第i-1行的二进制串pre,它们应该满足now and pre=0,且now or pre中也不能含连续奇数个0.对于最后一行,只要上一行的二进制串中不含连续奇数个0即可.code:var p:ar
阅读全文
posted @
2011-08-07 17:13
exponent
阅读(408)
推荐(0)
树形动规_(比赛转播)
摘要:比赛转播 tele.pas/c/cpp 【问题描述】 一个电视网络计划转播一场重要的足球比赛。网络中的传输点和接收点(即用户)可以表示一棵树。这棵树的根是一个传输点,它将转播比赛。树的叶节点是可能要接受这场比赛的用户(他当然可以选择不看比赛,这样就不要交款)。其他非根节点,非叶节点的中间节点为数据的中转站。 将一个信号从一个传输点传到另一个传输点的花费是给定的。整个转播的费用就是每一个传输费用的总和。 每一个用户(叶节点)都准备付一定的钱来看这场比赛。电视网络公司要决定是否要给这个用户提供电视信号。例如:给一个节点传输信息的花费太大,而他愿意的付款也很少时,网络公司可能选择不给他转播比赛。 写
阅读全文
posted @
2011-08-07 08:43
exponent
阅读(624)
推荐(0)
树形动规_(访问艺术馆)
摘要:访问艺术馆 gallery.pas/c/cpp【问题描述】 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动。艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室。Peer知道每个展室里藏画的数量,并且他精确测量了通过每条走廊的时间。由于经验老到,他拿下一幅画需要5秒的时间。你的任务是编一个程序,计算在警察赶来前,他最多能偷到多少幅画。 【输入格式】 第1行是警察赶到的时间,以秒为单位。第2行描述了艺术馆的结构,是一串非负整数,成对地出现:每一对的第一个数是走过一条走廊的时间,第2个数是它末端的藏画数量:如果第2个数是0那么说明这条走廊分叉为两
阅读全文
posted @
2011-08-06 21:14
exponent
阅读(571)
推荐(0)
树形动规_(没有上司的晚会)
摘要:没有上司的晚会(Ural) party.pas/c/cpp 【问题描述】 有个公司要举行一场晚会。 为了能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会邀请他的上司(上司的上司,上司的上司的上司……都可以邀请)。 每个参加晚会的人都能为晚会增添一些气氛值,求一个邀请方案,使气氛值的和最大。 【输入格式】 第 1 行一个整数 N(1<=N<=6000)表示公司的人数。 接下来 N 行每行一个整数。第 i 行的数表示第 i 个人的气氛值 x(-128<=x<=127)。 接下来每行两个整数 L,K。表示第 K 个人是第 L 个人的上司。 输入以 0 0 结束。 【输
阅读全文
posted @
2011-08-06 16:33
exponent
阅读(710)
推荐(0)
树形动规_(战略游戏)
摘要:战略游戏(SGOI) stragedi.pas/c/cpp 【问题描述】 Bob 喜欢玩电脑游戏,特别是战略游戏。但是他经常无法找到快速玩过游戏的办法。现在他有个问题。他要建立一个古城堡,城堡中的路形成一棵树。他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能了望到所有的路。注意,某个士兵在一个结点上时,与该结点相连的所有边将都可以被了望到。 请你编一程序,给定一树,帮 Bob 计算出他需要放置最少的士兵。 【输入格式】 输入文件中数据表示一棵树,描述如下: 第一行 N,表示树中结点的数目。 第二行至第 N+1 行,每行描述每个结点信息,依次为:该结点标号 i,k(后面有 k 条边与结点
阅读全文
posted @
2011-08-06 16:13
exponent
阅读(560)
推荐(0)
树形动规_(二叉苹果树)
摘要:二叉苹果树(Ural) apple.pas/c/cpp 【问题描述】 有一棵苹果树,如果树枝有分叉,一定是分 2叉(就是说没有只有 1个儿子的结点)。这棵树共有 N 个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是 1。我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有 4 个树枝的树。 2 5 \ / 3 4 \ / 1 现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。给定需要保留的树枝数量,求出最多能留住多少苹果。 【输入格式】 第 1 行 2 个数,N 和 Q(1<=Q<= N,1<N<=100)。 N 表示树的结点数,Q 表
阅读全文
posted @
2011-08-06 15:47
exponent
阅读(1658)
推荐(0)
树形动规_(技能树)
摘要:技能树(SGOI) skill.pas/c/cpp 【问题描述】 玩过 Diablo 的人对技能树一定是很熟悉的。一颗技能树的每个结点都是一项技能,要学会这项技能则需要耗费一定的技能点数。只有在学会了某一项技能以后,才能继续学习它的后继技能。每项技能又有着不同的级别,级别越高效果越好,而技能的升级也是需要耗费技能点数的。 有个玩家积攒了一定的技能点数,他想尽可能地利用这些技能点数来达到最好的效果,因此他给所有技能的所有级别都打上了分,他认为效果越好的则分数越高。现在他要你帮忙寻找一个分配技能点数的方案,使得分数总和最高。 【输入格式】 第一行是一个整数 n(1<=n<=20),表示
阅读全文
posted @
2011-08-06 15:19
exponent
阅读(684)
推荐(0)
动态规划_背包问题扩展
摘要:扩展问题中比较常见的就是求方案数和求第K优解.求方案数的问题中,一般是求将背包装满的方案数(求最优方案数不多见).代码很简单:var f:array[0..10000] of longint; v:array[0..100] of longint; n,m,i,j:longint;begin readln(n,m); for i:=1 to n do readln(v[i]); f[0]:=1; for i:=1 to n do for j:=v[i] to m do inc(f[j],f[j-v[i]]); writeln(f[m]);end.note:对于a1X1+a2X2+a3X3+..
阅读全文
posted @
2011-08-06 09:54
exponent
阅读(460)
推荐(0)
动态规划_背包问题基础
摘要:1.0/1背包var v,p:array[0..1000] of longint; f:array[0..100000] of longint; n,m,i,j:longint; function max(a,b:longint):longint; begin if a>b then exit(a); exit(b); end;begin readln(n,m); for i:=1 to n do readln(v[i],p[i]); for i:=1 to n do for j:=m downto v[i] do f[j]:=max(f[j],f[j-v[i]]+p[i]); writ
阅读全文
posted @
2011-08-05 21:50
exponent
阅读(264)
推荐(0)
基础整理_序言
摘要:NOIP在即,暑假还剩半月,是时候好好整理下基础知识了.forward~.
阅读全文
posted @
2011-08-05 20:39
exponent
阅读(118)
推荐(0)