摘要: 题意:n (n<=300)个村庄,要建设m (m<=30)个邮局,每个村庄使用最近的邮局,问总距离最小是多少?分析:最初的想法:dp(i, j)表示前j个村庄建设i个邮局,并且第i个邮局建设在第j个村庄的最小距离,则dp(i, j) = min ( dp(i-1,k) + dist(k,j) )。(i-1<=k<j, dist(k,j)为在村庄k和村庄j建设邮局,k和j之间的村庄到他们的最小距离)。由于n>=m,即最优解一定建设了m个邮局,第m个邮局可能建设在第k(m<=k<=n)个村庄,k+1~n的村庄只能到第k个村庄去,所以答案为min ( dp( 阅读全文
posted @ 2013-05-30 16:22 心向往之 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 题意:IOI99 花店橱窗布置 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目。花束可以移动,并且每束花用1到F的整数标识。如果I < J,则花束I必须放在花束J左边的花瓶中。例如,假设杜鹃花的标识数为1,秋海棠的标识数为2,康乃馨的标识数为3,所有花束在放入花瓶时必须保持其标识数的顺序,即杜鹃花必须放在秋海棠左边的花瓶中,秋海棠必须放在康乃馨左边的花瓶中。如果花瓶的数目大于花束的数目,则多余的花瓶必须空,即每个花瓶只能放一束花。每个花瓶的形状和颜色也不相同,因此,当各个花瓶中放入不同的花 阅读全文
posted @ 2013-05-30 13:54 心向往之 阅读(568) 评论(0) 推荐(0) 编辑
摘要: 题意:给一个N,求不超过N的哪个数的因子数最多,数目相同的取值小的那个。分析:反素数定义:g(i)表示 i 含有因子的数目,若小于x的任意数 i,都有 g(i)<g(x), 则x是一个反素数。反素数特性: x = 2^t1 * 3^t2 * 5^t3 * 7^t4 .....这里有 t1>=t2>=t3>=t4... t1>0 t2>0 t3>0...证明:如果ti<tj,其中i<j,由于pi小于pj,那么pi^tj*pj^ti<pi^ti*pj^tj,这样就出现了因子数目相同,但x更小的情况,与反素数的定义矛盾。然后搜索。。int 阅读全文
posted @ 2013-05-29 23:00 心向往之 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 题意:求C(a, b) 的约数个数。(a b<432)分析:C(a, b) = a! / b! / (a-b)!对于任意质数 p, n! 中有(n/p + n/p^2 + n/p^3 + ...)个质因子p。对于任意数 num = p1^a1 * p2^a2 *... pn^an ,其约数个数为(a1+1)*(a2+1)...(an+1)。int prime[100]={2,3,5,7...421,431,1000000};/*int s[1000005]={0};inline int cal(int n,int k){ int cnt=n/k; int sum=s[cnt]; ... 阅读全文
posted @ 2013-05-29 22:49 心向往之 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 题意:求第k个与m互质的数。分析:先求phi[m],区间[1, m]中有phi[m]个数与m互质。同样,在区间[ n*m +1, n*m +m ]中必然也有phi[m]个数与m互质,并且这phi[m]个数与[1 ~ m]的phi[m]个数是"一一对应"的。证明:设gcd(a + b, b) = p, p是a + b和b的公因子,那么p一定是a, b的公因子 (欧几里德。。)若k与m互质,假设k+m与m不互质,且其最大公约数为r,那么k与m必有公约数r,矛盾。。若k与m不互质,设其最大公约数为r,那么k+m与m必有公约数r,k+m与m不互质。 所以 “一一对应”。int m, 阅读全文
posted @ 2013-05-29 22:44 心向往之 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 题意:求大区间A B内离的最近和最远的两个素数,A B<=2,147,483,647。分析:先用大素数的线性筛法,预处理出1~sqrt(2,147,483,647)的所有素数,然后用 b[0] ~ b[B-A],来表示A+(0) ~ A+(B-A)的数是否是素数。。即若素数p*k = A+x --> A+x不是素数 --> b[x]=1 。#define Max 2147483647#define maxn 50000int prime[maxn],p;bool vis[maxn] ;void getPrime(int n){//大范围内素数的线性筛法 FOE(i,2,n){ 阅读全文
posted @ 2013-05-29 22:33 心向往之 阅读(115) 评论(0) 推荐(0) 编辑
摘要: 题意:n组数a[i], b[i],令ti =C(a[i], b[i]) ,求t1 t2 t3....的最大公约数。分析:C(a, b) = a! / b! / (a-b)! ,记录最小的a[i], 设为min,则公因子不可能比min大。枚举公共素因子p, a!里p的个数为c1 = a/p+a/(p^2)+a/(p^3)..., b!里p的个数为c2,(a-b)!为c3,则一共有ci = c1-c2-c3个pc1 c2 c3...中最小值即为最大公约数中的p的个数。const int M = 9592;int prime[M]={2,3,5,7,11,13......99991};int a[1 阅读全文
posted @ 2013-05-29 22:19 心向往之 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 题意:无向图中有n个点,编号1~n,可以从一点走到相邻某点,也可以原地不动,这样得到一条路径的描述。例如下图所示的无向图中,路径[1 2 2 7 5 5 5 7 4]是错误的,因为2不能到达7, [1 2 245 5 5 7 4], [1 247 5 5 5 7 4], or [1 2 265 5 5 7 4]都是正确的,定义两条路径A和B的距离dist(A, B) = sum d(ai, bi) ,其中若ai==bi, d(ai, bi)=1 否则d(ai, bi)=0。。给定一条路径A,求一条正确路径B,使AB的距离 dist(A, B) 最小。分析:dp(i, v)表示第 i 步为点 . 阅读全文
posted @ 2013-05-29 21:26 心向往之 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 题意:一个棋盘,0表示没放棋子,1 2 3 4表示放了该颜色的棋子,每次选择一个棋子消掉,同时跟它相连的同色棋子也会被消掉,消掉棋子后形成空格0,空格上方的棋子会掉下来,填补空格。如果某列全为0,右边整体向左移,填补空列。分析:广搜 0ms每行最多6个数,每个数为0~4,将其转化成一个6位数。 最多6行,所以一个状态需要6个数来保存,这里我用了一个长度为6的一维数组。。每次从队列里取出一个状态,将其还原到二维数组里,取某棋子消掉,按要求填补空格得到新的二维数组,再将新数组进行压缩,入队列。int dx[] = {-1,0,1,0};//up Right down Leftint dy[] = 阅读全文
posted @ 2013-05-29 18:11 心向往之 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 题意:給一个字符串,把它分成许多子串,要求每个子串必须是回文串,问最少分成几个子串?分析:dp[i]表示1~i分成的最少子串数,dp[i] = min (dp[j-1] + 1),(j~i是回文).const int M = 1005;char s[M];int len;int c[M];//c[i]表示以1~i的最少回文个数int pre[2][M], p, q, x, y;//pre[][i]到i是一个回文,即pre[][i]是i所在回文的对称点//p q是滚动数组下标 x y是个数int main(){ #ifndef ONLINE_JUDGE freopen("in.... 阅读全文
posted @ 2013-05-29 13:56 心向往之 阅读(151) 评论(0) 推荐(0) 编辑