
算法练习题
superpig101
一只特立独行的猪
展开
-
poj 2309
该题考查了满二叉树的基本性质,有观察可知,某个数x所处的层数k等于这个数的二进制最右边1的位置,比如12,它的二进制是1100,最右边的1的位置是3,所以12在的层数是k = 3,又由满二叉树的性质可得:该树的节点数等于2^k - 1,所以它的左右子树的节点数位(2^k - 1 - 1) / 2= 2^(k - 1) - 1,又由于2^(k - 1) = lowbit(x).左子树的节点的范围[m原创 2013-07-30 12:18:31 · 959 阅读 · 0 评论 -
poj 1604
java做的,特么慢.import java.util.*;import java.io.BufferedInputStream;import java.math.*;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(new BufferedInputS原创 2013-08-28 11:09:48 · 737 阅读 · 0 评论 -
高次幂取模
基本概念及思想对形如a^b mod m 的运算(b一般较大)但a,b,m都在long型范围内算法的主要思想是分治,分而治之。将大的问题分成若干个相似的较小的问题!具体实现是用递归的方法!举例2^100mod 3像这种运算如果先算出2^100 的值,然后再模上3,相信比较困难!我们可以将100变小点2^100=(2^50)^2 =((2^25)转载 2013-08-17 08:42:59 · 2557 阅读 · 0 评论 -
uva 10523
import java.io.*;import java.util.*;import java.math.*;public class Main{ public static void main(String[] args) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); while(cin.hasN原创 2013-08-29 10:16:29 · 709 阅读 · 0 评论 -
poj 2305
import java.io.*;import java.util.*;import java.math.*;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); int bas原创 2013-08-29 09:53:19 · 641 阅读 · 0 评论 -
sgu 112
import java.io.*;import java.util.*;import java.math.*;public class Solution{ public static void main(String[] args) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigD原创 2013-08-29 10:58:14 · 606 阅读 · 0 评论 -
uva 133
还是约瑟夫问题#include #include #include using namespace std;const int maxn = 25;int num[maxn];int flag[maxn];int main(){ int n,k,m; while(~scanf("%d %d %d",&n,&k,&m) && n && k && m) {原创 2013-09-03 18:08:25 · 749 阅读 · 0 评论 -
大数乘法
主要采用拆项的方法: #include #include #define maxnum 10000void mulp(int a[],int b[],int alen,int blen);void change(char s[],char t[]);void change(char s[],char t[]){ int i,j,lens,lent;原创 2013-04-30 11:41:27 · 1382 阅读 · 0 评论 -
poj 3264
第一次写线段树,参考了人家的才会.#include #include #include using namespace std;const int maxn = 50100;const int My_Max = 999999999;struct Node{ int l,r,Min,Max;};int h[maxn];Node st[maxn<<2 int="" nmax="" nmin="" vo原创 2013-07-27 23:05:03 · 664 阅读 · 0 评论 -
hdu 1166
简单题:#include #include using namespace std;const int maxn = 55000;int st[maxn << 2];void GetSum(int rt){ st[rt] = st[rt << 1] + st[rt << 1 | 1]; }void BiuldTree(int rt, int l, int r){原创 2013-07-29 13:42:04 · 569 阅读 · 0 评论 -
uva 10714
#include #include #include using namespace std;int main(){ int cas; scanf("%d",&cas); while(cas--) { int len,m,d; int Min,Max; Max = Min = -1; sca原创 2013-08-19 22:25:21 · 604 阅读 · 0 评论 -
uva 10026
对于任意的一项工作,设它的时间T1,罚金是P1,剩下的工作的时间是T2,罚金是P2.只要满足T1 * P2 所以只要对T/P进行排序就可以得到罚金最少的序列#include #include #include const int maxn = 1010;using namespace std;struct str{ int id;//编号原创 2013-08-19 16:45:51 · 583 阅读 · 0 评论 -
poj 3750
约瑟夫问题#include #include #include const int maxn = 55;const int maxl = 20;using namespace std;char name[maxn][maxl];bool flag[maxn];int main(){ int n; while(~scanf("%d",&n)原创 2013-09-03 16:39:33 · 847 阅读 · 0 评论 -
hdu 1241
简单的广搜题目,一次AC.#include #include #include #include using namespace std;struct node{ int x,y;};const int maxn = 105;char map[maxn][maxn];bool vis[maxn][maxn];int row,col;int d原创 2013-08-26 15:29:27 · 537 阅读 · 0 评论 -
hdu 1072
因为0#include #include #include #include const int maxn = 10;using namespace std;struct node{ int x,y; int time; int ans;};int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};int map[maxn][m原创 2013-08-25 22:09:44 · 828 阅读 · 0 评论 -
poj 1405
递推公式 Xn = Xn-1 * (Xn-1 - 1) + 1;import java.util.*;import java.io.*;import java.math.*;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(new Buffer原创 2013-08-28 10:13:09 · 748 阅读 · 0 评论 -
poj 1131
import java.util.*;import java.io.*;import java.math.*;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigDecimal ei原创 2013-08-27 17:03:03 · 658 阅读 · 0 评论 -
poj 1577
题目意思是根据它删除的节点构建出一棵树,然后先序遍历.用指针构建很简洁,但是指针没学好,各种bug,一下午就写了一棵树.代码中的Freefun()函数至今没调试对,求指教!!#include #include #include #include using namespace std;const int maxn = 100;typedef struct tnode{原创 2013-07-30 17:39:01 · 996 阅读 · 1 评论 -
zoj 2724
看了priority_queue的用法,才做这道题,很简单.#include #include #include using namespace std;struct mesg{ string str; int para; int prio; mesg(int a = 0): prio(a) {}};bool operator原创 2013-07-30 21:52:20 · 1032 阅读 · 0 评论 -
ACM学习方法
本来以为HNU的huicpc035和我一样退役了,后来听说他组成了新的footman队,于是又关注了下他。035体现了两个我觉得非常重要的品质:1、刻苦的训练2、有效的训练(本文将主要讨论个人训练,不讨论团队合作)而这些品质对于我们弱校ACMer选手水平的提高我觉得很重要。刻苦的训练我打算最后稍微提一下。主要说后者:什么是有效地训练?我想说下我的理解。很转载 2013-07-30 23:21:54 · 2973 阅读 · 1 评论 -
poj 1785
1.百度百科摘要:排序之后直接构造笛卡尔树的方法: 首先将节点序列按照key从小到大排序,然后按照顺序插入节点,注意到排序之后,插入的节点的key值一定是树中最大的,所以只需查找最右端的路径,找到一个节点A[i]的value大于待插入节点的value,同时A[i]->right的value小于待插入节点的value。找到之后,只需将A[i]的right指向待插入的节点,A[i]的ri原创 2013-07-31 11:51:45 · 835 阅读 · 0 评论 -
prufer编码
编码方式是: 这是一颗无根树,这课树的prufer编码为5,5,4,4,4,6。首 先选这棵树叶子中编号最小的点,将这个点删除,并且把它的邻接点加入一个数组中,例如第一个删除的节点为1,并且把5加入数组中。删除节点后形成一棵新的 树,再在新树中删除最小的节点,并且把邻接点加入数组中,,这样重复以上步骤,知道树中最后剩余两个点的时候终止操作。这时候数组中的便是prufer编 码。转载 2013-07-31 16:23:06 · 762 阅读 · 0 评论 -
Prufer编码的最优算法的学习笔记
1.Prufer简单编码算法. 给定标号树T的n-1条e1,e2...en-2,设计出标号树T的Prufer编码C0,C1...Cn-2的O(n2)的算法.数组e[ ]表示给定的标号树T的n-1条边,e[j][0]和e[j][1]分别表示边ej关联的2个顶点;数组d[ ]表示树T中各顶点的度;数组c[ ]表示标号树T的Prufer编码c0,c1,...,cn-3.原创 2013-07-31 20:49:27 · 1185 阅读 · 0 评论 -
poj 2567
Prufer编码的过程#include #include #include #include #include using namespace std;const int maxn = 20000;int fa[maxn];int son[maxn];int mark[maxn];int main(){ string str; s原创 2013-08-02 12:25:42 · 673 阅读 · 0 评论 -
poj 2201
构建笛卡尔树.#include #include #include using namespace std;const int maxn = 55000;int fa[maxn],lc[maxn],rc[maxn];struct node{ int num,key,val,f,l,r;} dt[maxn];bool Cmp(node a, node原创 2013-08-03 10:56:27 · 529 阅读 · 0 评论 -
poj 2568
最小堆问题,直接调用priority_queue.#include #include #include using namespace std;typedef long long LL;int main(){ priority_queue, greater > q; LL n,m; while(~scanf("%I64d",&n)){原创 2013-08-02 16:04:08 · 777 阅读 · 1 评论 -
poj 3437
参考了别人的代码,写的第一棵树.主要思路是先构建一个树然后求其高度.#include #include #include #include using namespace std;const int maxn = 11000;struct tnode{ int par; //父亲 int lc; //左儿子 int rc; //右二子原创 2013-07-30 10:22:57 · 1342 阅读 · 0 评论 -
求最长单调递减子序列
问题描述:求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}。 思路:这是很经典的一个问题,用动态规划解决。假设源数组为A,定义一个辅助数组为B,B[i]表示以A[i]结尾的最长递减序列的长度。举个简单的例子,如果A[i]大于之前的所有元素,那么B[i] = 1。 有了这个辅助数组后,可以推出下转载 2013-08-20 15:41:49 · 1187 阅读 · 0 评论 -
ACM之java速成
转载于http://hi.baidu.com/czyuan_acm/item/2c115f6b3d35192469105bae 这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目。1. 输入:格式为:Scanner cin = new Scanner (new BufferedInputStream原创 2013-08-27 11:11:58 · 796 阅读 · 0 评论 -
poj 1001
用Java高精度计算的题实在太简单了.import java.util.*;import java.math.*;public class Main { public static void main(String[] args) { Scanner aa = new Scanner(System.in); while(aa.hasNext()){原创 2013-08-27 11:21:54 · 585 阅读 · 0 评论 -
poj 1503
import java.util.*;import java.math.*;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); BigInteger a = BigInteger.ZERO; BigInteger sum =原创 2013-08-27 12:00:54 · 554 阅读 · 0 评论 -
hdu 1754
基础题目#include #include #include const int maxn = 210000;using namespace std;int st[maxn << 2];inline void GetMax(int rt) { st[rt] = max(st[rt << 1],st[rt << 1 | 1]); }void BuildTree(int rt,原创 2013-07-29 14:30:48 · 585 阅读 · 0 评论