自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 LeetCode Palindrome Partitioning II

class Solution {public: int minCut(string s) { int n = s.size(); bool p [n][n]; memset(p,0,sizeof(bool)*n*n); for(int i = 0;i < n;i++){ p[i][i] = true;

2014-03-08 21:01:21 574

原创 LeetCode Best Time to Buy and Sell Stock I,II,III

class Solution {public: int maxProfit(vector &prices) { int n = prices.size(); if(n==0)return 0; int* dp = new int[n]; memset(dp,0,sizeof(int)*n);

2014-03-03 17:25:08 553

原创 对printf和cout一点理解

printf是从内存中获取待输出的内容后,直接调用I/O设备进行输出;而cout在获取待输出的内容后,先将该内容拷贝到缓冲区,然后再将缓冲区里的内容输出到I/O设备。这样,它输出的东西在内存中都是连续的,这也是它为什么叫作流输出。每次键盘输入,都是将输入内容存到输入缓冲区,而scanf与cin都是从键盘输入缓冲区读取数据。那他们有什么区别呢?TBD

2013-03-15 13:05:23 564

原创 hoj 1868 八数码(双广+hash)

据说这题的数据不是很强,直接bfs+hash判重即可过。这里我打算拿它练习一下双广搜索。用了两个队列,分别从始态和终态进行bfs。队列中保存的是每一个状态,每一个状态是用一个一维数组保存的。hash时,把它转化成一个9位的整数,质数取余,拉链法判重。hash表开成两维的,分别储存两个队列的搜索结果,同时还保存搜到每一个状态所用的step。每当向hash表的一维里插入新状态时

2013-01-19 21:55:51 852

原创 poj 1511 Invitation Cards(spfa)

给一个有向图。求 1到所有点的最小距离之和与所有点到1最小距离之和相加的最小值。用一个正向的原图做一次SPFA..再将所有边反过来做一次SPFA。这题WA出翔了。最后发现dis数组和ans要用long long 来存。并且INF的选取也要小心,不能太大也不能太小。还有就是define INF的时候,后面要有ll,表示这是长整型。不然codeblocks里编译会有warning。但是提交不影

2012-12-16 17:57:13 384

原创 POJ 1861 Network(Kruskal)

求最小生成树。这题是special judge。Sample给的有问题,无视之。第一次写Kruskal,当模板吧。里面还套用了并查集的模板。#include #include #include #include #define MAXNODE 1500#define MAXEDGE 16000using namespace std;int parent[MAXNODE]; /

2012-12-16 13:08:40 368

原创 POJ The Suspects(基本的并查集)

没什么好说的,并查集的基本操作,都在注释里了#include #include #include #define MAXN 30005using namespace std;int parent[MAXN];int rank[MAXN];//并查集的秩,根据题意,这里选用树的结点数。void MakeSet(int n){ for(int i=0; i<=n;

2012-12-16 10:45:34 397

原创 关于函数的参数传递

首先看如下代码:void creatBtree(Node* head) //按前序生成树。{ head=new Node(); Node* p=head; int t; scanf("%d",&t); if(t==-1)return; else p->data=t; creatBtree(p->left); creatBtr

2012-11-23 00:16:21 584

原创 文件操作的小tips

freopen  功 能: 替换一个流,或者说重新分配文件指针,实现重定向。eg:   freopen("in.txt","r",stdin);  freopen("out.txt","w",stdout);/* close the standard output stream */  fclose(stdout);若要返回到显示默认的 stdo

2012-11-22 00:04:40 423

转载 乱七八糟

#line line_number "filename"语法: #line line_number "filename"#line命令是用于更改__LINE__ 和 __FILE__变量的值. 文件名是可选的. __LINE__ 和 __FILE__ 变量描述被读取的当前文件和行. 命令 #line 10 "main.cpp"更改行号为10,当前文件改为"main.cpp

2012-11-20 19:23:00 377

原创 Ordered Fractions(二叉搜索树)

题意:输入一个n,按从小到大的顺序输出从0到1之间的所有分母不大于n的最简分数。比较容易想到的是排序。可以用结构体表示一个分数,将所有符合条件的分数都存到数组里,然后sort一下,输出就行。注意cmp函数的写法bool cmp(node x,node y){ return x.a*y.b<x.b*y.a; //比较两个分数的大小,交叉相乘} 最近刚学了二叉树,可以用二

2012-11-18 23:41:38 470

转载 C++ fstream文件操作

ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:1、插入器(  向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout2、析取器(>>)

2012-10-30 10:51:42 359

原创 KeyWords Search(AC automation)

#include #include 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 TrieNod

2012-10-24 18:44:29 367

原创 HOJ 1225 Suptermarket(并查集)

题意:先给出商品个数n,然后对于每一个商品ai{pa,da},pa代表这个商品的利润,da代表这个商品必须在第d天之前售出. 每天只能卖出一个商品问如何安排卖的顺序,使得利润最大.输出最大利润分析:根据贪心的策略,按利润排序,利润最大的放在最前面.按ddl分集合ddl=1的集合,只能在0~1的时间卖.ddl!=1的集合,除了在ddl那天卖,还能在ddl之前的某一

2012-10-21 15:53:44 435

原创 HOJ 1056 Machine Schedule (二分图匹配,匈牙利算法)

题意:给k个任务,每一个任务都能被Computer A的x_mode或Computer B的y_mode处理。mode的转换需要重启。问如何安排任务的处理顺序,可以使得重启的次数最少。分析:二分图匹配。将每一个任务看成一条边,端点分别是Computer A的x_mode和Computer B的y_mode。求最小覆盖,即用最少的点数,使得每一条边至少都有一个点与它相连。根据最小覆盖=最

2012-10-19 08:49:25 474

原创 线段树基本应用——区间最值查询

感觉对线段树快有阴影了。。还是先从最简单的开始吧。关键是理解原理。求区间最小值:题目:2 //testcases 5 3  //n:数组元素个数,m:查询次数78 1 22 12 3  //输入数组,每个数最大值不超过10^51 2     //查询从l到r上的最小值3 54 4#include #inclu

2012-10-06 09:43:08 1970

原创 HOJ 2275 Number sequence(树状数组)

题意:给定一个n个元素的数列,令Ai, Aj, Ak,使得 Ai Ak 且 i  分析:n最大可达50000,常规的暴力枚举的话,复杂度为O(n^2),1s的时限肯定会超时。考虑树状数组:树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,能快速地获取连续几个数的和。令num[i]做c[]的下标,来检索树状数组对于本题数列中每输入一个元素num[

2012-10-03 16:38:52 559

原创 HOJ 1113 Stockbroker Grapevine (Floyd最短路)

题意:谣言在n个人之间传播,谣言从一个人传给另一个人需要一定时间(是有向图)。问谣言从哪个人开始传,传遍所有人所用时间最短(这里的时间指的是,传到最后一个人时所用的时间)。输出这个人的编号,及所需要时间。分析:Dijkstra是用来求单源最短路的,而这里起点不确定。采用Floyd算法先对图进行收缩,O(n^3)的复杂度。对每个点,找到这个点做源点时,谣言传遍所有人所需要的“时间”,遍历

2012-10-01 19:36:48 581

原创 Prim 与Dijkstra

PrimDijkstra目的最小生成树单源最短路 让所有边权值之和最小让每个顶点到源点路径上的权值最小 贪心,不断更新每个顶点到整棵树的距离贪心,不断更新每个顶点到源点的距离复杂度O(n^2),可堆优化到O(nlogn)O(n^2),可堆优化到O(nlogn)当图无权时,求最短路,dijkstr

2012-10-01 18:36:22 2620

原创 HOJ 1653 Heavy Transportation&& HOJ 1460 Heavy Cargo (Dijkstra 单源最短路)

题意:给出了城市数n,以及街道数m(街道是双向均可通行的), 对于每一条街mi,给出它的两端的城市,以及所能承载的最大货物运输量。要求输出,从城市1到城市n,最多能运输多少货物。分析:无向、带权图的单源最短路问题。 但这里路径的定义变成了:这条路上权值最小的那段路 的权值(而非所有段的权值之和)。我们的任务就是求出:每一条从1到n的路上,“路径” 的最大值。 这样,就成了求单源

2012-10-01 11:14:04 1808

原创 HOJ 1811 Freckles (Prim 最小生成树)

题意:平面上有n个点,并给出n个点的坐标。现在要用线把这些点全部连起来。问如何连使得线的总长度最短。分析:是一道裸的最小生成树问题。用Prim算法解决,贴到这儿当模板了。#include #include #include #include #define N 105#define INF 0xfffffffusing namespace std;struc

2012-10-01 10:36:32 489

原创 Poj 3281 && Regional Chengdu Food(Dicnic)

网络流最大流的优化算法Dicnic,每一步对原图进行分层,然后用DFS求增广路。时间复杂度是O(n^2*m) 。Poj 3281 和 9.16号成都regional网络赛food那道题,都是很好的模板题。。以food那题为例,这样建图:设一个源点,每一种food为一层,每个人分成两部分,people1 people2两层,每种饮料是一层,然后是一个汇点。每一种食物的个数,即

2012-09-17 22:36:59 517

原创 HOJ 1081 Scramble Sort

字符串处理。。题目就不介绍了。应该是一道比较水的题,思路很简单,就是排个序。但是有很多细节要注意,也很考验一些基本功。1.注意字母排序时是不区分大小写的。本来想用现成的sort,但是处理二维数组,并且还要忽略大小写,本弱菜不知道该怎么写了。最后放弃sort,自己写了一个对字符串进行排序的strsort。最朴素的n^2的排序。。还好最后没超时。2.对于数字,可以用atoi这个函数。a

2012-09-03 23:41:48 753

原创 HOJ 1956 Square(DFS+剪枝)

看到题目很容易想到要用DFS,但写出来之后发现TLE了。以为要用其它的算法,百度了下之后发现这题的考点就在于剪枝。刚开始我只用了两个剪枝:各木棍之和是否能被4整除;是否有木棍的长度大于正方形的边长。但事实证明还不够。关键的两个剪枝在DFS里面。具体看代码及注释吧。注意:每一次递归进去,开始搜索的位置的选择,经常是可以进行重要优化的!//DFS+剪枝优化#include #i

2012-09-02 23:56:44 348

原创 HOJ 2778 CPU scheduling(STL 优先级队列+模拟)

题意:模拟CPU处理多个任务的过程。首先输入任务数n,然后下面n行每行对应一个任务的信息:任务id,到达CPU的时间,处理它所需要的时间,优先级。一个任务在处理过程中,如果有下一个任务到达并且该任务优先级高于正在处理的任务,则要中止当前任务,转而进行下个任务。若是两任务优先级相同,先执行先到达的任务。大致思想:用了两个优先级队列,一个用来存储用户的输入,另一个用来存储已经到达的,正在等

2012-08-30 17:06:55 454

转载 关于优先级队列STL

STL之priority_queue【转】STL之priority_queue【转】 STL之优先队列原本以为priority_queue很简单,才知道原来懂的只是最简单的形式。头文件:#include优先队列,也就是原来我们学过的堆,按照自己定义的优先级出队时。默认情况下底层是以Vector实现的heap。既然是队列,也就只有入队、出队、判空、大小的操作,并不具备

2012-08-28 16:30:02 3534

原创 HOJ 1898 Babelfish(Trie树)

题意就是先输入一个字典: 目标字符串-----输入字符串然后输入一个字符串,在上面的对应关系中进行查找,如果有则输出目标字符串,没有则输出eh。如果不想超时的话,明显就要套字典树了。代码贴上来,留作模板。字典树还是挺简单易懂的嘛。。。#include #include #include #include using namespace std;const

2012-08-27 22:26:25 415

原创 HOJ 2064 Journey to Tibet (DFS)

题目中要求只要两个村庄间的距离小于等于30就可以转移。而刚开始我以为这个人最多只能走30,转移的路超过30之后就不能再转移了。刚开始用的BFS,怎么写都超时。后来发现看错题了之后,果断换成了DFS,然后才AC。本来挺简单的一道,浪费了大半天的时间。。不过最后能过掉还是很开心的。。#include #include #include #include using namespace

2012-08-24 16:53:11 512

原创 HOJ 1447 Compromise (DP)

是一道要记录公共子序列内容的DP。状态转移方程部分:for(int i=1; i<=len1; i++) { for(int j=1; j<=len2; j++) { if(!strcmp(str1[i],str2[j])) {

2012-08-24 16:49:25 330

原创 HOJ 1456 Team Queue(用queue进行模拟)

这题用的是queue,还有用了map实现将不同的人分到若干组。queue里的元素还是queue,这样就能实现插队的功能了,直接在特定的queue后面push即可。这里还用了一个bool型的visit数组,用来记录这一个team中是否有人已经在队列里。如果有,直接在对应的queue后面push一个新member。如果没有,说明这个member是他们team里面第一个来排队的,直接把他push在队尾即

2012-08-24 16:32:33 756

原创 HOJ 3034 Mysterious (二分)

这道题比赛当时没做出来。后来听jingo讲了用二分,试了一下,过了。#include #include #include #include #include #include #define M 1000001using namespace std;//对天数n进行二分int menu[10001][51];int days,dishes,budget;bool che

2012-08-24 16:20:54 317

原创 HOJ 2608 Assemble(二分)

用一个结构体保存每一个部件,包括quality,price,name,type.先按quality降序排序,注意排序的时候不要将同类的部件打散,要保证同一类部件连在一起。再用componets数组,记录从i到j是哪一个部件。如componets[i]=0,componets[i+1]=3,则知第0到第2条记录是属于部件i的。然后关于质量进行二分。质量的范围取所有部件的质量最

2012-08-24 16:08:32 1195

原创 HOJ 2278 IP Filtering (二分)

HOJ 2278主要思路:将IP地址看成4位256进制的数,转化成十进制,一个segment就是一个区间。先将所有的segment按左端点升序排列,如果几个segment有重叠,则将它们合并成一个区间。int dn=0; l=seg[0].start; r=seg[0].end; for(int j=1;j<i;j++) {

2012-08-24 16:06:42 633

原创 HOJ 2576 Simple Calculation 容斥原理(DFS)

输入两个数n,m,再输入一个有n元素的集合x[n]。求从[1,m]中有多少个数,能被x[n]中至少一个数整除。这题利用了容斥原理。容斥原理在编程中实现起来一般有dfs+剪枝和按位运算两种。按位运算易于调试,但是不适于大数据量。第一次写还是感觉挺困难的,参考了别人的代码。是用dfs写的。参照他的思路我自己又写了一遍,却总是WA,找了好久也没发现错在哪。。。先贴上来吧。自己写的

2012-08-23 19:59:45 1263

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除