博客
-
USACO 3.2.1 Factorials 解题报告
花了出奇的长时间,以前我是做过这题的,但是当时的话并没有实际的考虑清楚,因为我知道10就是由2和5组成的,我当时的算法就是用ans保存当前的尾数,然后遇到一个5就除以二,但是没考虑平方,那我就保存后5尾数就AC了,但是这个做法是欠妥的,你想啊,如果万一那个尾数是100002,虽然不切实际(如果切实际我就不能AC),但是确实不够严谨。 想了好久,想到了一个算法,不会怕特殊情况了,先把所有的5的个数统计出来,然后除去相应的2就可以了。 代码如下:
/ LANG: C ID: yyogoo1 PROG: fact4 / #includeint main(void) { int ans = 1; int i, j; int n, k = 0; freopen("fact4.in", "r", stdin); freopen("fact4.out", "w", stdout); scanf("%d", &n); for(i = 2; i -
USACO 3.1.6 Stamps 解题报告
这一题我就用的动态规划:f[l]=max(f[l], f[l – num[i]]); f[0] = 1; l是总面额,i是第num[i]个邮票的面值,但是超时,没想到别的算法,怎么办?找地方剪枝,见了三处就AC了,这效果立竿见影啊!后来到网上看了下,还有更快的方法,我是三重循环,它是二重循环,用f来记录当前使用的邮票总数(这种方法到别出去吧~- –)
-
USACO 3.1.5 Contact 解题报告
这个题目其实算法还是比较简单,关键是怎么保存这些数字,其实啊,最好的保存方法就是二进制,且增加前缀1,比如0就是二进制10即十进制2,想必聪明的你要问为什么需要前缀1了,为什么呢?如果不要的话那么0和00都是二进制的0,怎么区分呢?所以用前缀1,那么最大的话也就是12位的1加一个前缀1,2^13=8192,接下来自己想想吧。
-
USACO 3.1.4 Shaping Regions 解题报告
这个题目用数组来记录纸的每一个颜色是不可能的,无论是时间上还是空间上都无法忍受,就只能用具体的矩形来表示了,比如底纸,就是一张(0, 0, a, b, 1)的底纸,代表起始坐标是(0, 0)末坐标是(a, b)颜色是1,将它加入数组作为第一个元素,当添加进了一个新的矩形的时候,将数组所有的元素都和这个新的矩形比较,如果该元素被盖住了,就把数组中的那个元素拆分成几个没有被盖住的元素。 其实描述的很笼统,代码明天加入吧,在Ubuntu里面,现在不想切换过去了。 代码如下:
de lang="c">/ ID: yylogoo1 PROG: rect1 LANG: C / #include struct paper{ int x1, y1; int x2, y2; int c; }; struct paper pa[4001]; int len; int stack[4000]; int top; int pop(void) { if(top == 0){ return len++; } return stack[–top]; } void push(int k) { stack[top++] = k; } void add(struct paper t) { int k; k = pop(); pa[k] = t; } void del(int k) { pa[k].x1 = -1; push(k); } void deal(struct paper new, int old_n) { struct paper old = pa[old_n], t; if(new.x1 <= old.x2 || old.x1 <= new.x2){ return ; } if(new.y1 <= old.y2 || old.y1 <= new.y2){ return ; } del(old_n); if(new.x1 = old.x2 && new.y2 <= old.y2){ return ; } if(old.x1 new.x2){ t = old; t.x1 = new.x2; add(t); old.x2 = new.x2; } if(old.y2 < new.y2){ t = old; t.y1 = new.y2; add(t); old.y2 = new.y2; } } int color[2501]; int main(void) { int n; int i, j; int a, b; struct paper t; freopen("rect1.in", "r", stdin); freopen("rect1.out", "w", stdout); scanf("%d%d%d", &a, &b, &n); add((struct paper){0, 0, a, b, 1}); for(i = 0; i = 0){ color[pa[i].c] += (pa[i].x2 – pa[i].x1) * (pa[i].y2 – pa[i].y1); } } for(i = 1; i <2500 i ifcolori> 0){ printf("%d %d\n", i, color[i]); } } return 0; } de> -
寒假计划
这阵子一直在看一个电视剧《第五空间》,确实感觉很假,但是里面有些情节还是不错的,引用加修改里面一句话吧,”这个寒假,活出个样来。“
这一次制定出来的一份计划,跟初三的暑假相比人性化一点,呵呵,有不少空余时间,休息也好,不休息也好,有时候做题目上瘾了,时间到了肯定不会下来的,所以考虑到这些个人自私的因素,就增加了一些缓冲时间。
然后,这个寒假我想开学能让同学们看到成效,计算机的成效他们肯定是看不见的,所以增加了一个小时的五大竞赛除信息以外的做题时间,到开学了,就算一个月的寒假,也会有明显的变化的,呵呵,我喜欢把自己放在公众下,把这个欲望变成动力吧!!还有就是每天的第一个任务,实在是嫌自己的身高了,整啥啥不对,天给我的东西,想改变很难吧,不过命和自由都是我的。
具体的计划如下(这只是一个草稿,可能还会有修改):08:30
09:00
跑步,锻炼(为了身高和健康,拼了)。
09::00
10:00
做题(估计没到9点我就上机了。)
10:00
10:30
鸟哥Linux私房菜
11:00
11:30
算法导论
11:30
12:00
高考英语听力
14:00
14:30
C++ Primer
15:00
17:00
做题目
17:30
18:00
高考英语的听力
20:00
21:00
五大竞赛除了信息全做(数学, 物理, 化学, 生物)
21:30
22:30
Linux 内核
-
Linux 备份还原指令
dump [-f 备份文件] 待备份资料
-S #仅列出备份的话占用多少空间
-u #将这次dump的时间记录到/etc/dumpdates
-v #将dump的过程显示出来
-j #使用bzip2备份,进行简单压缩(level 2)
-level #dump备份的等级
-f #类似与tar, 备份成的文件的名字
-W #显示在/etc/fstab里面设置了dump的分区是否备份过restore #恢复dump的内容
-t #显示含有什么数据, 类似与tar -t
-C #比较实际数据和备份数据的差异
-i #进入互动模式
-r #还原文件系统(目录)到当前目录下 -
USACO 3.1.3 Humble Numbers 解题报告
这个题目属于什么算法呢?我才疏学浅不知道,反正就是用num来记录丑数,假设1为丑数,代码实现会简单些,那么丑数必定就等于另外一个丑数乘以一个素数,那么再一个个的按大小找到前n个丑数,就可以了。 时间的话大概是O(nm),对每个素数都记录该和哪个丑数相乘start[i],如果sub[i](第i个素数)num[start[i]]是下一个丑数,那么start[i]就加一,如果sub[i]num[start[i]]和当前最大的丑数(就是才成为丑数的丑数)相等的话那start[i]也是要加一的,就这样循环。
/LANG: C ID: yylogoo1 PROG: humble / #includeunsigned sub[100], num[100000]; int start[100]; int len; void add(int k) { num[len++] = k; } int main(void) { int i, j, k; int m, n; int min, in; freopen("humble.in", "r", stdin); freopen("humble.out", "w", stdout); scanf("%d%d", &m, &n); for(i = 0; i <m i scanfu subi add whilelen="n){" min="0xFFFFFFFF;" fori="0;" i m i ifsubi numstarti="= num[len" - starti ifmin> sub[i] num[start[i]]){ in = i; min = sub[i] * num[start[i]]; } } add(min); start[in]++; } printf("%u\n", num[n]); return 0; } -
USACO 3.1.2 Score Inflation 解题报告
这题和第三章第一题一样,标准的无限01背包,直接把代码放进去就可以了,代码:
/ LANG: C ID: yylogoo1 PROG: inflate / #includeint f[10001]; #define max(a, b) ((a)<(b)?(a):(b)) int main(void) { int m, n; int i, j; int a, b; freopen("inflate.in", "r", stdin); freopen("inflate.out", "w", stdout); scanf("%d%d", &m, &n); for(i = 0; i <n i scanfdd a b forj="b;" j="m;" j fj="max(f[j" - b a fj printfdn fm return code> -
USACO 3.1.1 Agri-Net 解题报告
这题的话,是最小生成树的标准题,但是最小生成树我不记得写了,后来想起来了之后发现这个二叉堆实现很麻烦,就看看标称的二叉堆是怎么实现的,结果标称直接暴力就是,呵呵,感觉有点投机取巧,因为数据小所以这样。 晚点捉摸下二叉堆的实现,先把这题的代码贴上来(暴力搜的)
/ LANG: C ID: yylogoo1 PROG: agrinet / #includeint map[100][100]; int used[100]; int main(void) { int i, j, k, l; int n; int ans = 0, t; freopen("agrinet.in", "r", stdin); freopen("agrinet.out", "w", stdout); scanf("%d", &n); for(i = 0; i