摘要: 这两题的思路都是将等式化成左右两部分,用一个hash数组,先把左边的结果存起来,然后计算右边的结果直接寻址就行,不过,HDU那道题要注意剪枝,如果系数全为正或者全为负则直接输出0,POJ那道题hash函数定义成char型的,否则会超内存。。 HDU_1496 Equations:#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int N = 2000009;int hash[N];int main(){ //freopen("data.i 阅读全文
posted @ 2011-08-20 09:03 AC_Von 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 说点自己的理解。Hash 是散列的意思,所谓的散列,可以理解为将字符串转换为固定长度(一般是更短长度)的数值或索引值的方法。数据结构书上提到的构造hash函数的方法有四种:平方取中法、折叠法、除留余数法,直接定址法。 此外,有了hash函数就有冲突,就是说可能两个不同的字符串经过hash函数处理后的结果相同。解决冲突的方法有:开放定址法、链地址法;hash例题见:http://www.cnblogs.com/vongang/category/316530.html 阅读全文
posted @ 2011-08-19 20:37 AC_Von 阅读(321) 评论(0) 推荐(0) 编辑
摘要: 典型的贪心题目,做过很久了,今天复习贪心,回头看了看,顺便把报告补上。我的思路是做一个标记变量flag和一个计算的变量k(k = n),flag初始为0,每次找一个满足(l <= l' && w <= w' && !flag)的序列,并将序列元素的flag标为1,总序列就会减少一个数所以k--,找完一个序列,结果ans++。然后回头再找第一个falg = 0的元素,确定新的序列。如此循环。。。代码:#include <iostream>#include <cstdio>#include <cstdlib& 阅读全文
posted @ 2011-08-19 19:34 AC_Von 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 这道题整了一下午,最后还是看别人的解题报告弄出来的,先说说我的理解吧。大体处理思路是利用贪心思想,每次取权值最大的节点,不断的将权值最大节点与它的父节点合并。过程:1、初始时将序列中的time[i]都置为1,w[i]置为c[i];2、查找最大的w[i], 返回其位置;3、将该位置的c[]与它的父节点c[]合并(合并过程就是C_i / T_i,C_i = c[该节点] + c[父节点],T_i = time[该节点]+time[父节点])得到新的父节点w[](w[父节点] = C_i / T_i),如果有节点与pos相连,让它指向pos的父节点;4、重复2、3,知道合并完;至于如何求出结果:初. 阅读全文
posted @ 2011-08-19 18:31 AC_Von 阅读(1597) 评论(0) 推荐(0) 编辑
摘要: 这道题思路。。。想破脑袋没想起来,开始按A排序,后来按B排序,再后来按A/B排序,然后正序走一遍,逆序走一遍,都不对!最后看的解题报告,崩溃!!!按B-A排序。至于证明,不会!这道题告诉我们,关于贪心问题,只要涉及到排序,+,-,*,/,都试试,没准有一个可以的。。。#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;const int N = 1007;struct node{ int a; int b;}num[N];int cmp(const void * 阅读全文
posted @ 2011-08-19 10:01 AC_Von 阅读(302) 评论(0) 推荐(0) 编辑
摘要: VonGang原创,如有错误,欢迎指正。转载请注明:http://www.cnblogs.com/vongang/ 如图,先求出每一个岛屿所对应的雷达区间,让后利用贪心思想即可,类是会场布置问题。(注意:c语言qsort函数对浮点操作时可能有点误差,本人因为这个贡献出无数WA。。。) #include <stdio.h>#include <stdlib.h>#include <math.h>#define N 1002struct node{ double s; double e;}num[N];int cmp(const void * a, const v 阅读全文
posted @ 2011-08-18 21:25 AC_Von 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 很典型的贪心算法,不过要注意奇偶,比如:S: 4 6E: 5 7这个例子答案是多少?答案是20。5和6重合,所以要分两次搬完。从上边可以看出当E为奇数时,如果下一个的S = E+1,则要多搬一次;同理当E为偶数,如果下一个的S = E-1, 也要多搬一次;代码:#include <stdio.h>#include <stdlib.h>#define N 207struct node{ int e; int s;}num[N];int cmp(const void * a, const void *b){ return (*(struct node*)a).e - (*( 阅读全文
posted @ 2011-08-18 10:01 AC_Von 阅读(691) 评论(0) 推荐(0) 编辑
摘要: 我用的高精度加法模拟的,不过看到好多人0MS过了,肯定有更好的方法。AC代码先放这,回头再想。。。(据统计F(1000)是208位,开数组时注意。。。。)#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 1007;int f[N][217];int main(){ int i, j; f[1][0] = f[2][0] = 1; for(i = 3; i < N; i++) { for(j = 0; j <= 210; j 阅读全文
posted @ 2011-08-17 21:07 AC_Von 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 在说这题之前请容我先说几句:1047!你妹是multiple test cases!你全家都是multiple test cases!!!丫,高精度没啥说的,光格式WA了两次!这不是浪费时间吗!#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAX = 107;int sum[MAX];char ss[MAX];int main(){ //freopen("data.in", "r", stdin); 阅读全文
posted @ 2011-08-17 19:58 AC_Von 阅读(196) 评论(0) 推荐(0) 编辑
摘要: VonGang原创,如有错误,欢迎指正。转载请注明:http://www.cnblogs.com/vongang/ 贪心算法的思想在于只求局部最优,不管全局如何。但是这样得出的结果往往也是全局最优的,当然也有的不是全局最优。以背包问题为例: [背包问题]有一个背包,背包容量是M=150。有7个物品,物品不可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。 物品 A B C D E F G 重量 35 30 60 50 40 10 25 价值 10 40 30 50 35 40 30 分析: 目标函数: ∑pi最大 约束条件是装入的物品总重量不超过背包容量:∑wi&l 阅读全文
posted @ 2011-08-17 17:08 AC_Von 阅读(343) 评论(0) 推荐(0) 编辑
摘要: VonGang原创,如有错误,欢迎指正。转载请注明:http://www.cnblogs.com/vongang/ 当对很大的数(比如100位)进行运算时,肯定不能c/c++内的数据类型直接运算(当然Java里的BigNumber可以。。。)这时就要用数组模拟运算过程。+, - ,*, /,运算貌似是小学学的东西,童鞋们,现在要用到小学的知识啦!!先说加法,大体的操作包括逆序、对位、求和、进位(其实就是小学的加法运算,不过是把数倒过来算,至于为什么要逆序。。。)例题:http://poj.grids.cn/practice/2981代码:#include <stdio.h>#inc 阅读全文
posted @ 2011-08-17 16:55 AC_Von 阅读(376) 评论(0) 推荐(0) 编辑
摘要: VonGang原创,如有错误,欢迎指正。转载请注明:http://www.cnblogs.com/vongang/堆排序的涵盖很广,笔者也是初窥门径,写不了很高深的东西,这里就记录一些简单的用法。小根堆:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆,又称最小堆。大根堆:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆。(这里讨论的只是二叉堆)建堆过程:堆排序过程堆排序动画演示:http://www.jcc.jx.cn/xinwen3/news/kj/flash/2004/0426/1297.htm典型题目HUD_1280 : http: 阅读全文
posted @ 2011-08-17 16:33 AC_Von 阅读(553) 评论(0) 推荐(0) 编辑
摘要: VonGang原创,转载请注明:http://www.cnblogs.com/vongang/快排过程很简单,就是一个二分的思想,过程如下(从小到大为例):1、取一个关键字;2、把序列中大于关键字的放在关键字右边;3、把序列中小于关键字的放在关键字左边;4、重复1-3步,直到序列有序;代码+注释:#include<stdio.h>#define N 100int QuickSort1 (int r[], int low, int high){ int key; key=r[low]; /*取轴值记录关键字*/ while(low<high) /*从表的两端交替地向中间扫描*/ 阅读全文
posted @ 2011-08-17 16:12 AC_Von 阅读(334) 评论(0) 推荐(0) 编辑
摘要: VonGang原创,转载请注明:http://www.cnblogs.com/vongang/二叉排序数的(递归)定义:1、若左子树非空,则左子树所有节点的值均小于它的根节点;2、若右子树非空,则右子树所有节点的值均大于于它的根节点;3、左右子树也分别为二叉排序树。如图:链表实现(比较简单):View Code #include <stdio.h>#include <malloc.h>typedef struct node{ int data; struct node * lchild; struct node * rchild;}node;void Init(node 阅读全文
posted @ 2011-08-17 15:54 AC_Von 阅读(386) 评论(0) 推荐(0) 编辑
摘要: VonGang原创,转载请注明:http://www.cnblogs.com/vongang/ 栈和队列都是最基础的数据结构,栈的思想是“先进后出”,队列的思想是“先进先出”。怎么说呢,栈和队列其实都是对于单链表或者数组的一些特殊操作。在后边很多算法中经常用到(比如BFS, SPFA。。。)栈主要操作有:入栈Push;取栈顶Get_Top;出栈(删除栈顶元素)Pop;栈的数组实现(代码非常简单,关键是思想)://数组实现#include <stdio.h>#include <malloc.h>#define maxsize 10typedef struct{ int d 阅读全文
posted @ 2011-08-17 14:55 AC_Von 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 第一道kmp的题目,没想到纠结在上边这么多时间,也不知道哪错了,反正改着改着就对了。。。#include <iostream>#include <cstdio>using namespace std;const int maxn = 1000000;const int maxm = 10000;int a[maxn+10], b[maxm+10];int next[maxm+10];void get_next(int num[], int m){ next[0] = -1; for(int i = 1, j = -1; i < m; i++) { while(j 阅读全文
posted @ 2011-08-17 09:10 AC_Von 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 把与某个楼成相连的上下楼层为边建立一个图,边的权值为1.如:3 3 1 2 5可建成图:map[1][4] = 1;map[2][5] = 1;map[3][2] = 1;map[3][4] = 1;map[4][2] = 1;然后用最短路经的解法Floyd, Bellman_Ford, SPFA, Dijkstra...这里用的是Dijkstra解法My Code:#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int inf = 1000000 阅读全文
posted @ 2011-08-16 21:00 AC_Von 阅读(362) 评论(0) 推荐(0) 编辑
摘要: 很裸的最短路径问题,这里用Dijkstra做的,前边已经写过Floyd和SPFA算法SPFA:http://www.cnblogs.com/vongang/archive/2011/08/16/2141334.htmlFloyd:http://www.cnblogs.com/vongang/archive/2011/08/16/2141019.htmlMy Code:#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int maxnum = 107; 阅读全文
posted @ 2011-08-16 19:35 AC_Von 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 查SPFA的资料时偶尔看到一种运用,然后很淡定的敲之1A了15MS+328k code:#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 207;const int inf = 100000000;int vis[N], map[N][N];int dis[N], q[N];void spfa(int n, int s){ int i, f, r, p; memset(vis, 0, sizeof(vis)); for(i = 0; 阅读全文
posted @ 2011-08-16 17:34 AC_Von 阅读(722) 评论(0) 推荐(0) 编辑
摘要: 求图中任意两点间的最短路径,个人感觉用Floyd比较好,有人说这道题可以用SPFA,目前还没有这方面的思路,先把Floyd的做法贴上,以后再补Floyd code:#include <iostream>#include <cstdio>using namespace std;const int inf = 100000000;const int N = 208;int dis[N][N];int n;void Floyd(){ int i, j, k; for(k = 0; k < n; k++) for(i = 0; i < n; i++) ... 阅读全文
posted @ 2011-08-16 17:03 AC_Von 阅读(313) 评论(0) 推荐(0) 编辑
摘要: 结构体中定义记录染色次数的参数(cov),更新时直接找到对应的区间,使cov++。查询时要有点小操作。查询过程:void query(当前节点 t,要查询的点 x){ if(找到要查询的点) return cov; if(该点的cov > 0) { 左孩子.cov += 当前节点.cov; 右孩子.cov += 当前节点.cov; 当前节点.cov = 0; } mid = (左孩子+右孩子) >> 1; if(x <= mid) query(左孩子, x); else query(右孩子, x);}下边是完整的代码:View Code #include <std 阅读全文
posted @ 2011-08-15 17:27 AC_Von 阅读(209) 评论(0) 推荐(0) 编辑
摘要: poj上1A, HDU上6A,我晕啊!注意几点:1、多组数据;2、memset(c, 0, siezeof(c));3、memset(ans, 0, sizeof(ans));my code:View Code #include <stdio.h>#include <string.h>#define N 32010int c[N], n, ans[N];int lowbit(int i){ return i&(-i);}void add(int i, int val){ while(i <= N) { c[i] += val; i += lowbit(i) 阅读全文
posted @ 2011-08-15 16:01 AC_Von 阅读(184) 评论(0) 推荐(0) 编辑
摘要: PalindromesA regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string"ABCDEDCBA"is a palindrome because it is the same when the string is read from left to right as when the string is read from right to left.A mirrored string is a s 阅读全文
posted @ 2011-08-15 10:57 AC_Von 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右()圆括号(表达式)/函数名(形参表).成员选择(对象)对象.成员名->成员选择(指针)对象指针->成员名2-负号运算符-表达式右到左单目运算符(类型)强制类型转换(数据类型)表达式++自增运算符++变量名/变量名++单目运算符--自减运算符--变量名/变量名--单目运算符*取值运算符*指针变量单目运算符&取地址运算符&变量名单目运算符!逻辑非运算符!表达式单目运算符~按位取反运算符~表达式单目运算符sizeof长度运算符sizeof(表达式)3/除表达式/表达式左到右双目运算符*乘表 阅读全文
posted @ 2011-08-15 09:22 AC_Von 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 线段树题目,每一段存这一段的最大值。查询时直接匹配线段,找出最大值就行,更新有点小操作要注意。结构体struct node{ int l, r; int max;}node[N*4];两数取较大的:int Max(int a, int b){ return a > b ? a : b;}建树void creat(int t, int l, int r){ node[t].l = l; node[t].r = r; if(l == r) { node[t].max = stu[l]; //用一个stu[]存储N个学生的初始成绩, 方便... 阅读全文
posted @ 2011-08-14 14:47 AC_Von 阅读(252) 评论(0) 推荐(0) 编辑