摘要:
最小覆盖问题,跟3041差不多,只不过有了不能覆盖点的限制,首先横竖染色,那么每个水坑要么没横着的覆盖,要么被竖着的覆盖,用染出色的该点木板颜色连边,求最大匹配即可。View Code 1 program pku2226(input,output); 2 var 3 map : array[0..51,0..51] of char; 4 x,y : array[0..51,0..51] of longint; 5 f : array[0..2500,0..2500] of boolean; 6 v : array[0..25... 阅读全文
摘要:
给一个n*n的矩阵,其中有一些坏东西需要消灭,用激光炮每次消灭一行或一列中的所有坏东西,问最少次数。总结一下,对于每个坏东西,我们有两种方案消灭它,横着打或者竖着打,满足最小覆盖的定义,用方案做点(即每个坏东西的x坐标和y坐标),连边求最大匹配OKView Code 1 program pku3041(input,output); 2 var 3 f : array[0..1100,0..1100] of boolean; 4 v : array[0..1100] of boolean; 5 lk : array[0..1100] of longint; 6 ... 阅读全文
摘要:
有两台机器A,B,分别有n,m个进程,有k个任务,每个任务要么在A的x进程上完成,要么在B的y进程上完成,但机器换进程要时间,求完成方案下的最短时间。最小覆盖问题,通式:方案有两个,作为二分图的对立点,而任务为点,完成每一个任务的两种方案连边,求最大匹配即可,因为“最小覆盖=最大匹配”很不理解输入里面的那个i有什么用??View Code 1 program pku1325(input,output); 2 var 3 f : array[0..201,0..201] of boolean; 4 lk : array[0..201] of longint; 5 ... 阅读全文
摘要:
有两个长度为N的序列A和B,在A和B中各任取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。把a,b数组排序后,用pos[i]表示当前与a[i]取得未取最小值的b[j]的编号j,也就是说pos[i]=k{a[i]+b[k]-->min}每次取min{a[i]+b[pos[i]]}输出,再将pos[i]加一即可,这个算法是n^2的,进一步思考,取一堆数中的最小值,可以用堆维护,nlognView Code 1 {为方便heap中存编号而不是具体值} 2 program sequence(input,output); 3 var 4 a,b,pos : array[0..... 阅读全文
摘要:
给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数的定义可以转化为在序列中大于它和小于它的数的个数相等。序列总数就是以它为左端点的+以它为右端点的+它不做端点的怎么求看代码View Code 1 program median(input,output); 2 var 3 f,a : array[-100000..110000] of longint; 4 n,i,x : longint; 5 max,pos,answer : longint; 6 begin 7 assign(input,'median.in... 阅读全文
摘要:
给一个有向图,顶点数少于50,有Q条询问(Q<=100000),对于每条询问(x1 y1),输出他们之间的最小密度路径的密度(长度比边数)两种实践方法,一个是FLOYD,再就是二维SPFA,注意数据有环,SPFA时要控制边数少于n才行,至于为什么,是困扰几代人的烦恼了。d[i,j,k]表示从i到j走过k条路径的最小路径长度floydView Code 1 program path(input,output); 2 var 3 i,j,k,l,m,n,w,p,x,y:longint; 4 max,tmp:real; 5 f:array[0..51,0..51,0..51] of... 阅读全文