I and OI
Past...

随笔分类 -  POJ

1 2 3 下一页
收集了我做过的POJ上值得一写的题目,有些题目在某个专题中写过的,就不在这里列出了.
POJ1204
摘要:AC自动机模板题.. code: const maxnodes=500000;var fx:array[1..8] of char=('E','F','G','H','A','B','C','D'); t:array[0..maxnodes,'A'..'Z'] of longint... 阅读全文
posted @ 2012-01-02 13:07 exponent 阅读(821) 评论(0) 推荐(0)
POJ网络流小结
摘要:POJ 1698 题意:有N部电影,分别可以在一个星期的几天拍摄,并可以拍W个星期,Alice可以有D个星期拍这部电影,一天只能拍一部电影。问Alice能否拍完所有电影。 构图:把日程表上所有的点弄出来,如果电影能在这天拍摄,则从电影I向这天连容量为1的边。源点向每一部... 阅读全文
posted @ 2011-11-11 09:48 exponent 阅读(7194) 评论(0) 推荐(7)
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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(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) 推荐(0)

1 2 3 下一页