自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SyntaxHighlighter的使用方法

写网页,想高亮代码,一种常见的方法就是使用SyntaxHighlighter。首先进入官方页面下载压缩包。解压后发现有好几个文件夹,里面有好多css、js文件。下面是具体的使用方法:其实是抄官方的installation说明的,自己试过可以,这里翻译了一下。1、在解压好的文件里找到shCore.js,shCore.css 和 shThemeDefault.css,放到与html

2012-07-30 23:52:26 576

原创 提取POJ archive中的AC代码(第一个Linux shell脚本)

想把自己AC的代码全部弄出来,可是POJ 的 Archive 把每道题都分了一个文件夹,手工一个一个移出来实在麻烦,于是有了这个脚本。#!/bin/shcd pojfor i in `seq 1000 4000`do if [ -e $i ] then echo $i cd $i find -name "*AC*" -exec mv {} ../$i.cpp \;

2012-07-30 23:47:03 491

原创 POJ 3041 Asteroids (二分匹配.Hungary)

把行、列分别看作二分图的左、右边,若在坐标(i,j)处有一点,则左边的第 i 点与右边的第 j 点相连。此二分图的最大匹配数就是答案。至于是什么原理,没有搞懂。。好像是关于最小覆盖什么的。最大匹配即是最小覆盖,应该有人证过。二话不说,匈牙利算法。#include#include#define FOR(i, N) for(int i = 1; i <= (N); i++)usi

2012-07-29 22:18:44 259

原创 POJ 1789 Truck History (MST.Prim)

感觉还是理解题目比较难一些。。算法还是Prim,没有特别 的变化。之前都按自己的理解写的Prim,这次看了算法导论中的伪代码,原来Prim还有更快速的实现方法。这个方法把与树的距离用一个域储存了一起,这样就不用每次都查找与树相邻的边了。#include#include#include#include#include#include#define FOR(i, N) for(

2012-07-28 22:51:31 217

原创 POJ 1125 Stockbroker Grapevine (最短路径.Floyd-Warshall)

将这N个点依次作为源点,求最短路径,只要把这些最短路径中的最小值输出。Floyd-Warshall算法其实就是用到了DP。求 i 到 j 的最短路径,k 为中间点编号的最大值,i 到 j 的最短路径要么包括 k, 要么不包括 k。#include#include#include#define FOR(i, N) for(int i = 1; i <= (N); i++)usin

2012-07-27 23:48:49 242

原创 POJ 2253 Frogger (最小生成树.Prim)

从点 1 开始生成最小生成树,直到将点 2 加入到树中,返回树中最大的边即可。基本算法是Prim。#include#include#include#define FOR(i, N) for(int i = 1; i <= (N); i++)using namespace std;double cost[500][500];int coordinate[500][2];

2012-07-27 23:04:36 292

原创 POJ 1062 昂贵的聘礼(最短路径.Dijkstra)

因为有等级限制,关键是要枚举所有可能的情况。例如 M = 2, 酋长的等级是 4,那么所有能参与交易的人的等级要么是 2 ~ 4, 要么是 3 ~ 5, 要么是 4 ~ 6。只要把不能参加交易的人排除,算出最短路径即可。然后取各种情况中的最小值输出。所以核心算法还是 Dijkstra。#include#include#include#define FOR(i, N) for(in

2012-07-27 00:00:24 468

原创 POJ 1860 Currency Exchange (最短路径.Bellman-Ford)

用到的是 Bellman-Ford 算法。有些不同的是标准的 Bellman-Ford 是求最短路径的,而这道题有求最大路径的意思。需要判断的是是否有回路,这里也跟标准的判断是否有负权回路有所不同,这里判断的是是否有“正权回路”。具体实现方法是,只要将原本算法中的大于号小于号全部反转即可。交的时候自己心里也没底,后来竟然一次过了~#include#include#define FO

2012-07-26 23:51:25 558

原创 POJ 3295 Wormholes (ShortestPath.Bellman-Ford)

你妹啊,终于过了。题目的意思是要判断一个图中是否有负权回路,由于太菜,最先想到的是 Floyd-Warshall 算法,求出每个点到每个点的最短距离。毫无疑问TLE了。发现应该用 Bellman-Ford 之后,最先以为把每个点作为源点,然后才能判断是否有负权回路,还是 TLE。其实只要把其中某个点作为源点,就能判断是否有负权回路。Bellman-Ford 的步骤:(1)循

2012-07-25 23:58:51 227

原创 POJ 2485 Highways (MST.Prim)

赤裸裸的MST问题。#include#include#define FOR(i, n) for(int i = 0; i < (n); i++)using namespace std;int cost[500][500];bool inTree[500];void init(int N){ FOR(i, N) FOR(j, N) scanf("%d", &cos

2012-07-24 22:07:08 243

原创 POJ 2352 Stars(树状数组)

有一些点,某个点的 level 被定义为在它左下的点的个数,问各 level 各有多少点。由于输入时 y 坐标是增序来的,所以可以忽略 y,用一个树状数组 c [ x ] ,来表示目前在坐标 x 以左的点的个数。#include#include#includeusing namespace std;int c[40000];int lowBit(int x){ retu

2012-07-13 00:11:54 188

原创 POJ 1274 The Perfect Stall (第一道二分图最大配对)

看了别人解释了什么是二分图后,才想起来原来离散数学中讲的 Bipartite Graph 就是它。这道题是最大配对问题,用到了匈牙利算法。其实理解了就不难,主要有三步: 读取数据,并用一种数据结构表示(邻接矩阵,邻接表都行) 取某一边的集合,对每一个点都进行dfs dfs 的过程也就是寻找所谓的可增广路的过程#include#includeusing namespace

2012-07-13 00:04:58 426

原创 POJ 2140 Herd Sums (发道水题)

有N只牛,编号为1, 2, 3 ... N,问取其中几头牛,有几种取法使取出的牛的编号和为N。只要考虑取出的牛的头数(M),从1开始迭代,若能使编号和为N,那么 N - (1 + 2 + ... + M) 必然能被 M 整除。 #includeusing namespace std;int main(){ int n; int result = 0; cin >> n;

2012-07-12 23:52:47 1246

原创 POJ 2492 A Bug's Life (并查集)

有一些昆虫,给出若干它们的配对关系,判断其中是否有虫子搞基。一开始也是想到并查集,但是没有想到怎么实现,后来参考了一下人家的做法。精髓是要设一组变量,标记每只虫子的第一个对象。边读取数据,边更新这组变量和并查集,直到找到基佬就OK。#include#includeusing namespace std;typedef struct{ int father; int co

2012-07-10 23:42:30 432

原创 POJ 1258 Agri-Net (Prim)

一个小镇,要给所有的农田的通电,每对农田间的距离不同,问怎样铺设电线使电线的总长度最少。最小生成树问题,所以用 Prim 算法,跟之前一篇有点像。#includeusing namespace std;int f[101];int cost[101][101];bool inSet[101];int main(){ int n; while(cin >> n){

2012-07-10 23:28:22 199

原创 CodeForces 16C Monitor(gcd,水题)

有一批分辨率为 a * b 的显示器,要将长宽比例调整为 x  : y,问应该如何缩小显示器,使缩小后的面积最大。容易出错的地方是x 和 y 可能不互质,所以要求出最大公约数,给 x :y约分。#includeusing namespace std;int gcd(int a, int b){ if(a == 0 || b == 0) return a + b; else

2012-07-10 23:22:13 397

原创 POJ 1931 Biometrics (计算几何、标量积、向量积)

题目看起来比较有趣,模拟人脸识别,指纹识别。具体是这样的:用两组点分别表示两个几何图形,判断这两个几何图形是否相似。“相似“的标准是:通过旋转和放大缩小操作能过使两个图形相等。判断旋转要用到向量积和标量积,光用一个是不够的,因为 sin 和 cos 函数在 0 到 360 度定义域内的值不是唯一的。判断放大缩小,只要算向量的模就可以。#include#include#defin

2012-07-08 23:46:21 465

原创 POJ 2318 TOYS (计算几何,向量积,二分查找)

题目意思很简单,一个盒子,被几条直线分成几个部分,然后有一些随机分布的点,问各部分中点的个数分别为多少。基本思路是判断点在直线的左边还是右边,这里要用到向量积,在不同边向量积是正负性是不同的。只要找到一个区间,左边的直线和右边的直线同这个点,得到的向量积正负性不同,即可。查找的方法是二分查找,至于查找的方向,也是由向量积决定 的。#includeusing namespace std

2012-07-08 23:22:38 326

原创 HDU 1224 Free DIY Tour (DP again!)

有N个城市,从某城市出发到到终点城市,每次经过一个城市都会得一定的分数,但不是每个城市间都是连通的,图中无环路,并且单向。问怎样走得分最高。DFS应该也可以做,不过看起来用DP思路更简单些,依次对每个城市求最大值,只要把该城市的分数加上能够到达该城市的其他城市的分数相加,并记录路线即可。#include#includeusing namespace std;struct {

2012-07-08 00:17:27 231

原创 POJ 3787 Convex Hull of Lattice Points(凸包)

还是凸包,只不过常规的求法第一步是找最左下的点,而这题是找最左上的点。实质没有不同。#include#include#include#define PI 3.141592653using namespace std;typedef struct{ int x, y;} POINT;POINT ch[100];double dist(POINT a, POINT b)

2012-07-08 00:16:32 478

原创 POJ 1113 Wall (凸包)

给一个多边形(可能是凹的),然后给出一个最小周长围住这个多边形,围的墙至少要离这个多边形一定距离。凸包,最后加上求周长即可。#include#include#include#define PI 3.141592653using namespace std;typedef struct{ int x, y;} POINT;POINT ch[1000];doub

2012-07-08 00:12:37 171

原创 UVa 681 Convex Hull Finding (凸包,Graham‘s Scan)

这道题目没有直接给出一些点,而是给出了一个凹多边形,让求凸包。这让我误以为不用先根据极点排序了,可以直接scan...后来发现好多反例,还是老老实实来。Graham‘s Scan 其实步骤不复杂:(1)选出最左下的点;(2)对剩下的点按极角排序;(3)按序进栈出栈。第(3)步,判断进栈出栈的标准,其实就是判断线段的走向。其中第(2)和(3)步都要用到矢量积,也就是外积。#inc

2012-07-07 23:54:42 643

原创 HDU 1159 Common Subsequence(还是DP)

给出两个字符串,求出他们最大的 Common Subsequence。所谓字符串A的 subsequence,就是A所含的字符的一部分或者全部组成的字符串,并且字符的顺序和A中出现的顺序相同。用f [ i ][ j ]表示处理到字符串A的第 i 位 和 字符串B第 j 位时的最大值。f [ i ][ j ] = f[ i - 1 ][ j - 1 ] + 1  (A[ i ] == B[

2012-07-04 23:17:42 243

原创 HDU 2602 Bone Collector(01背包,DP)

典型的01背包。第一次做~用f [ i ][ j ] 来表示当处理到第 i 项物品,并剩 j 容量时的最大价值。那么 f [ i ][ j ] = max( f [ i - 1 ][ j ], f[ i - 1 ][ j - volume[ i ] ] + value[ i ])。#include#include#includeusing namespace std;in

2012-07-04 23:02:25 162

原创 HDU 1231 最大连续子序列(DP)

给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20。 要求得到最大和,并输出该子序列的第一个和最后一个元素。思路是DP,用f [ i ]表示以第 i 个数字为结尾的子序列的

2012-07-04 22:52:47 672

原创 HDU 4221 Greedy?(DP)

题目是这样的:有N个任务要完成,每个任务都有一个时限,和完成这个任务所需要的时间。如果完成时的时间超过了时限,就要惩罚跟超过的时间相同的分数。若使罚分中的最大值最小,这个最小值是多少?做完才发现有点像DP。。先把这些任务按 deadline 排序,然后用方程以此求出即可。f [ i ] = max (f [ i - 1], cost[1 to i] - deadline [ i ] )

2012-07-04 22:45:20 382

原创 LightOJ 1136 Division by 3(取模)

一些数:1, 12, 123, 1234, ..., 12345678910, ... 然后给出两个数A, B,求出第A个数和第B数之间又多少个数能够被3整除。首先要运用到一个性质:一个数的数字和相加能被三整除,那么这个数也能被3整除。(1)然后可以发现:连续三个整数并排在一起组成的数的数字和必然能被3整除。(2)最后通过(2)总结出:1.题目中的第3K个数,必然能被三整除

2012-07-04 22:18:11 1256

原创 LightOJ 1042 Secret Origins(二进制、STL)

将一个数字化为二进制,并算出这个二进制数所含‘1’的个数,求出最小的比这个数大的并含相同‘1’个数的数。先将二进制数转化成 string,再用next_permutation() 即可。不过还有一种情况,就是这个二进制数已经是最后一个排列了,这时候就要给原二进制加上一位数了,具体做法体现在代码中。#include#include#includeusing namespace std;

2012-07-04 22:17:51 669

原创 LightOJ 1337 The Crystal Maze(第一道DFS)

输入一类似迷宫的图,迷宫中有墙,有水晶,问如果降落在迷宫中某一点,迷宫中除墙意外能随意走动,最多能收集到多少水晶。虽然一看就是深搜或者广搜,由于之前真没有做过这类题目,大一下学的算法也忘的差不多了,全靠自己想出来。思路很简单,从起点开始,向四周扩散,并给已经经过的点标记。有一个规律是若起点在同一相通区域内,最后答案是相同的,所以第一次求出某个区域某点的答案后,如果起点再次从落到这个区域内,就不用再

2012-07-04 22:17:34 464

原创 LightOJ 1006 C Hex a bonacci (取模、水~)

这道题目比较有新意,给出了一段代码,然后要优化这段代码,完成相同的功能,但是要减少时间、空间复杂度。其实题目本身不是很难,可惜自己太菜,又TLE,又WA。由于最后答案是要取除以一个大质数的余数的,最后答案又跟中间步骤的答案线性相关,所以也要给中间步骤的答案取除以这个大质数的余数,否则就会超过 int 的精度。附上代码:#include int a, b, c, d, e, f;int dp[

2012-07-04 22:17:21 504

原创 POJ 2528 Mayor's Poster(还是线段树,外加离散化)

题目意思是在一道墙上贴海报,后面贴的海报可能把前面的覆盖,之后给出一个区间,要输出这个区间内能够看见的海报数目。乍一看非常像POJ 2777涂颜料那道题目,仔细一想还是有很大的不同。首先海报数量十分巨大,不可能用上位运算,这也意味着每次query都要查询到线段树的叶。其次墙所表示的区间十分大,即时能够被 __int64 表示,过大的区间也很容易造成MLE。所以要用上离散化,将整个区间缩小到相对

2012-07-04 22:16:52 335

原创 POJ 2777 Count Color(线段树、lazy思想)

大意是一块定长的木板,在上面涂颜色,每次涂一个区间,当询问某个区间时,要返回这个区间中的颜色数目。这道题目其实和3468非常之像,也是要更新区间,也用到了lazy思想。可能略有不同的是,这道题目有个用到位运算的小技巧。由于总颜色数目较少(#include#include#define MID(x, y) ((x + y) >> 1)#define R(x) (x << 1 | 1

2012-07-04 22:16:21 244

原创 POJ 3468 A Simple Problem with Integers(线段树、lazy思想)

题目大意是给出一串数学,之后可能对某个区间内的所有数字都增加一定的量,也可能对某个区间进行查询,要求返回这个区间内所有数字的和。Training 给出了8 道关于线段树的题目,手气好第一道就抽中最简单的。但是还是被折腾了不少时间,一开始用最简单的方法对每个区间进行update,试了几次都是TLE。后来才发现其实可以不用每次都update所有区间。Update时,如果到一整个区间都需要updat

2012-07-04 22:16:03 223

原创 POJ 3264 Balanced Lineup(第一道线段树)

是summer training code section里的一道题目,当时没有做出来。由于第一次接触线段树,一开始尝试用min_element() 和 max_element(),结果必然是TLE了。。另外这道题目的坑爹之处就是用 cin、cout 会TLE,换成scanf、printf 就没有问题。看来还是 cstdio 比较快一些。其实是线段树中非常简单的一道题目。附上代码: #

2012-07-04 22:15:40 250

原创 POJ3629 2436(CUHK summer training on 28 JUN 2012)(队列、二进制)

AB水过。C:POJ3629 打牌模拟题。K张牌中有N张好牌,每次发牌前将前P张放在最底,如何安排牌的位置使每次某人拿到的牌都是好牌。  用数组自编一个queue可以AC,然而使用C++ vector 或者 queue 都会造成TLE。可见用数组模拟速度快不少。 D:POJ2436 有N头牛,有D种疾病,每头牛都含某几种、或者不含病。现将这些牛的牛奶混合在一起,且牛奶中的病毒种类不

2012-07-04 22:14:40 430

原创 POJ3781-3786(Unknown Summer Training ID 8911 0x03 on hust oj)(枚举、贪心、动态规划)

一共9道题,完成前6道。A:  问题:输入10个数,输出10个数中第3大的数。  STL sort函数水过。B:  问题:输入n个数字,将这些数字分成若干组,使每组数字的和相同,只有连续的数字才能被分在同一组。给出一种分法使每组数字的和最小,输出该最小值。  思路:枚举 + 贪心。至多循环n次。第i次循环: 将第i个数加入第一组,之后判断后续的数是否能按第一组的和分

2012-07-04 22:14:28 416

原创 POJ2718(枚举 + 贪心)

问题: 有N个0到9的数字,互不重复。用这些数字组成2个整数,每个数字只能用一次,且必须用尽所有数字,且0不能在第一位(除非组成的整数是0)。求组成整数的差的最小值。思路:  可以将所有情况分为两类:    (1)N是偶数:可以将这N个数字平分,使每个整数含N/2个数字。要使差最小,只需使两个整数最高有效位的差最小,然后使用贪心算法使次高有效位及以后的位数的差

2012-07-04 22:13:58 790

原创 POJ1176 (规律循环)

问题:  有N个开着的灯,和控制这个N个灯的四个开关。四个开关作用不同。第一个开关:flip所有的灯。第二个开关:flip奇数编号的灯。第三个开关:flip偶数编号的灯。第四个开关:flip编号为3 * K + 1 的灯,其中K = 0,1,2....。已知在C次操作后其中几个灯的状态,给出所有灯在这C次操作后所有可能的状态。方法:  通过观察可以发现,这些灯一共可以分成4种,同种灯无

2012-07-04 22:13:29 343

原创 POJ1256 (C++ compare函数)

问题:  有一个只含大小写字母的字符串,给出所有该字符串的排列,以字典顺序输出。其中 'A'方法:  只需调用C++ STL中 next_permutation() 和 sort() 函数,重点在于编写自定义的compare() 函数。hint:(compare 函数的编写方法)bool cmp(int a, int b){ a = ....;

2012-07-04 22:12:59 536

原创 POJ2153 (C++ map)

问题:  存在N个学生,并有M次考试,分别计算每次考试后某个人的综合排名。方法:  声明一个从 string 到 int 的map类,其中 string 对应名字, int 对应分数。hint:  可将该 map 类看做以 string 为 index 的数组。

2012-07-04 22:12:14 265

空空如也

空空如也

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

TA关注的人

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