10 2012 档案
C++ fstream文件操作
摘要:ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:1、插入器(<<) 向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'\n';就表示把字符串"Write Stdout"和换行字符('\n')输出到标准输出流。2、析取 阅读全文
posted @ 2012-10-30 10:51 MicZ 阅读(312) 评论(0) 推荐(0)
KeyWords Search(AC automation)
摘要:#include <cstdio> #include <cstring> using namespace std; const int num_char=26; struct TrieNode { TrieNode *branch[num_char]; TrieNode *fail; int count;//if this is the last node of the word TrieNode() { fail=NULL; count=0; memset(branch,NULL,sizeof(bra... 阅读全文
posted @ 2012-10-24 18:44 MicZ 阅读(197) 评论(0) 推荐(0)
HOJ 1225 Suptermarket(并查集)
摘要:题意:先给出商品个数n,然后对于每一个商品ai{pa,da},pa代表这个商品的利润,da代表这个商品必须在第d天之前售出. 每天只能卖出一个商品问如何安排卖的顺序,使得利润最大.输出最大利润分析:根据贪心的策略,按利润排序,利润最大的放在最前面.按ddl分集合ddl=1的集合,只能在0~1的时间卖.ddl!=1的集合,除了在ddl那天卖,还能在ddl之前的某一天卖,所以将ddl的商品,做成ddl-1的商品的子树.#include <iostream> //按deadline进行分集合 #include <cstdio> #include <memory.h> 阅读全文
posted @ 2012-10-21 15:53 MicZ 阅读(341) 评论(0) 推荐(0)
HOJ 1056 Machine Schedule (二分图匹配,匈牙利算法)
摘要:题意:给k个任务,每一个任务都能被Computer A的x_mode或Computer B的y_mode处理。mode的转换需要重启。问如何安排任务的处理顺序,可以使得重启的次数最少。分析:二分图匹配。将每一个任务看成一条边,端点分别是Computer A的x_mode和Computer B的y_mode。求最小覆盖,即用最少的点数,使得每一条边至少都有一个点与它相连。根据最小覆盖=最大匹配。求该二分图的最大匹配即可。使用匈牙利算法。代码如下:#include <iostream> #include <cstdio> #include <memory.h> 阅读全文
posted @ 2012-10-19 08:49 MicZ 阅读(159) 评论(0) 推荐(0)
线段树基本应用——区间最值查询
摘要:感觉对线段树快有阴影了。。还是先从最简单的开始吧。关键是理解原理。求区间最小值:题目:2 //testcases5 3 //n:数组元素个数,m:查询次数78 1 22 12 3 //输入数组,每个数最大值不超过10^51 2 //查询从l到r上的最小值3 54 4#include <cstdio> #include <algorithm> #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 using namespace std; const int maxn = 阅读全文
posted @ 2012-10-06 09:43 MicZ 阅读(223) 评论(0) 推荐(0)
HOJ 2275 Number sequence(树状数组)
摘要:题意:给定一个n个元素的数列,令Ai, Aj, Ak,使得 Ai < Aj > Ak 且 i < j < k这样的三个数为一组。求出一共有多少组。分析:n最大可达50000,常规的暴力枚举的话,复杂度为O(n^2),1s的时限肯定会超时。考虑树状数组:树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,能快速地获取连续几个数的和。令num[i]做c[]的下标,来检索树状数组对于本题数列中每输入一个元素num[i],就在树状数组num[i]位置,即c[num[i]]加1,表示这里有一个数。这样,sum(num[i]-1) ,即c[1]+c[2]+...... 阅读全文
posted @ 2012-10-03 16:38 MicZ 阅读(154) 评论(0) 推荐(0)
HOJ 1113 Stockbroker Grapevine (Floyd最短路)
摘要:题意:谣言在n个人之间传播,谣言从一个人传给另一个人需要一定时间(是有向图)。问谣言从哪个人开始传,传遍所有人所用时间最短(这里的时间指的是,传到最后一个人时所用的时间)。输出这个人的编号,及所需要时间。分析:Dijkstra是用来求单源最短路的,而这里起点不确定。采用Floyd算法先对图进行收缩,O(n^3)的复杂度。对每个点,找到这个点做源点时,谣言传遍所有人所需要的“时间”,遍历所有点,找到最短的那个“时间”,复杂度为O(n^2)。对于floyd算法:算法描述:(1) 用数组dis[i][j]来记录i,j之间的最短距离。初始化dis[i][j],若i=j则dis[i][j]=0,若i,j 阅读全文
posted @ 2012-10-01 19:36 MicZ 阅读(234) 评论(0) 推荐(0)
Prim 与Dijkstra
摘要:PrimDijkstra目的最小生成树单源最短路让所有边权值之和最小让每个顶点到源点路径上的权值最小贪心,不断更新每个顶点到整棵树的距离贪心,不断更新每个顶点到源点的距离复杂度O(n^2),可堆优化到O(nlogn)O(n^2),可堆优化到O(nlogn)当图无权时,求最短路,dijkstra算法 可用bfs代替 阅读全文
posted @ 2012-10-01 18:36 MicZ 阅读(241) 评论(0) 推荐(0)
HOJ 1653 Heavy Transportation&& HOJ 1460 Heavy Cargo (Dijkstra 单源最短路)
摘要:题意:给出了城市数n,以及街道数m(街道是双向均可通行的), 对于每一条街mi,给出它的两端的城市,以及所能承载的最大货物运输量。要求输出,从城市1到城市n,最多能运输多少货物。分析:无向、带权图的单源最短路问题。 但这里路径的定义变成了:这条路上权值最小的那段路 的权值(而非所有段的权值之和)。我们的任务就是求出:每一条从1到n的路上,“路径” 的最大值。 这样,就成了求单源最长“路径”。//hoj 1653 //Dijkstra 单源最短路 //注意此题中路长的定义变成了,各段路的权值的最小值 #include <iostream> #include <cstdio> 阅读全文
posted @ 2012-10-01 11:14 MicZ 阅读(153) 评论(0) 推荐(0)
HOJ 1811 Freckles (Prim 最小生成树)
摘要:题意:平面上有n个点,并给出n个点的坐标。现在要用线把这些点全部连起来。问如何连使得线的总长度最短。分析:是一道裸的最小生成树问题。用Prim算法解决,贴到这儿当模板了。#include <iostream> #include <cstdio> #include <memory.h> #include <cmath> #define N 105 #define INF 0xfffffff using namespace std; struct Point { double x,y; } points[N]; double map[N][N]; b 阅读全文
posted @ 2012-10-01 10:36 MicZ 阅读(158) 评论(0) 推荐(0)