摘要: 最小生成树。这题不难,可是一直TLE,花了我好长时间调试,无奈下看了一下讨论板,有人说用G++超时,用C++过了,于是乎我改用C交,过了……无语…… 阅读全文
posted @ 2011-08-04 13:45 moonbay 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 赤裸裸的最短路 阅读全文
posted @ 2011-08-03 21:01 moonbay 阅读(92) 评论(0) 推荐(0) 编辑
摘要: 都是赤裸裸的最小生成树问题 阅读全文
posted @ 2011-08-03 20:58 moonbay 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 赤裸裸的最小生成树/* * hdu1233/linux.c * Created on: 2011-8-2 * Author : ben */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#define MAXN 105int map[105][105];int N, M;/** * 普里姆求最小生成树,返回最小生成树的权值,返回-1表示图不连通 */int MST_Prim() { int lowcost[MAXN]; int i, j, k, m 阅读全文
posted @ 2011-08-02 22:01 moonbay 阅读(205) 评论(0) 推荐(0) 编辑
摘要: /* * hdu2588/linux.c * Created on: 2011-8-2 * Author : ben */#include <stdio.h>#include <math.h>int phi(int x) { int i, res = x, temp = (int) sqrt(x); for (i = 2; i < temp + 1; i++) { if (x % i == 0) { res = res / i * (i - 1); while (x % i == 0) { x /= i; } } } if (x > 1) { res = r 阅读全文
posted @ 2011-08-02 11:56 moonbay 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 熟悉卡特兰数的人一眼就能看出这题该怎么做,恶心的是这题最大数据为35,结果在long long范围之内,可是如果用递推公式不当,运算过程中还会溢出。解决的办法是换一个递推公式,或者写成我下面这样/* * hdu2067/linux.c * Created on: 2011-7-31 * Author : ben */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>void work();int main() {#ifndef ONLINE_JUDGE 阅读全文
posted @ 2011-08-01 12:27 moonbay 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 没什么,都是推公式。2064中设n个盘子需要g(n)步,则g(n)=3*g(n-1)+2,很好想,从而得通项公式g(n)=3^n-1;2077中加了一个条件,难想一些,为了便于说明,我们把三根柱子分别记为柱A、柱B、柱C,第n个盘子记为盘n,那么最优情况肯定是先把上面n-2个盘子移到柱C上,再把盘n-1和盘n依次移到柱B上,然后把柱C上的n-2个盘子移回柱A,接着把盘n-1和盘n移到柱C上,最后再把n-2个盘子移到柱C即可,这个过程中,把n-2个盘子从柱A移到柱C(或反向移动)的过程与2064题是完全一样的。故移动n个盘子的步数f(n)=3*g(n-2)+4,代入上面的通项公式得f(n)=3^ 阅读全文
posted @ 2011-07-31 19:50 moonbay 阅读(192) 评论(0) 推荐(1) 编辑
摘要: 这几天做了好几道错排题目,这题就直接在hdu2069的代码上改了,直接过了/* * hdu2068/linux.c * Created on: 2011-7-31 * Author : ben */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>void work();int main() {#ifndef ONLINE_JUDGE freopen("data.in", "r", stdin);#endif w 阅读全文
posted @ 2011-07-31 12:36 moonbay 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 这题一看,用动态规划、母函数应该都可以,我用深搜水过~/* * hdu2069/linux.c * Created on: 2011-7-28 * Author : ben */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>int kind;int money[5] = {50,25,10,5,1};int num[5];void dfs(int step, int remainmoney) { int i, temp = 0; if(step = 阅读全文
posted @ 2011-07-28 17:59 moonbay 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 找一个子序列的和等于M,那么这个子序列可以看成a+1, a+2, ... , a+d 这时,d就为这个序列的长度,起始数字就是a+1,而这个序列的和即M=a*d + (1 + d) * d /2;得出d*d<2 * m,从而可以枚举d,计算出a 阅读全文
posted @ 2011-07-28 14:18 moonbay 阅读(133) 评论(0) 推荐(0) 编辑