ACM/Algorithms
文章平均质量分 71
Uranux
这个作者很懒,什么都没留下…
展开
-
HDOJ 2054 A == B ?
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2054这道题坑特别多:放几组数据:// 均为YES0.0 0.00-0 0-0. +.00.1 00.104 4+1 1-1 -1.01.0 1.0+.020 00.02代码如下(主要练习string的iterator):#include #i原创 2013-12-31 22:01:21 · 768 阅读 · 0 评论 -
HDOJ 2955 Robberies (01背包)
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2955本题只需要先把背包容量“被抓的概率”P,换成“成功逃脱的概率”1-P,然后进行01背包,最后得出“最大的成功逃脱几率”P1,则1-P1就是“最小的被抓概率”,题目便迎刃而解。代码如下:#include#include#define N 105double V,v原创 2012-02-20 14:55:10 · 375 阅读 · 0 评论 -
HDOJ 3339 In Action (最短路+01背包)
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3339思路:先用dijkstra求出基地(0点)到各个发电站的最短路径,统计出电量之和P,则P/2+1就是需要摧毁的最少电量值。然后进行01背包,背包容量是从基地到各个发电站的最短路径的总和,物品就是每条最短路径,其容量为路径长度,价值为该路径终点发电站的电量值。然后即可求出满足给定价值的原创 2012-02-20 15:02:37 · 751 阅读 · 1 评论 -
HDOJ 2647 Reward (拓扑排序)
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2647本题是一个典型的拓扑排序,但是在排序的过程中需要对结点进行分层。拓扑排序采用消去零入度结点法,分层的时候需要注意:当消去一个结点时,其子结点是属于下一层的,应当用数组is_next[]进行标记,防止分层混乱(此处贡献多个WA)。另外,为了方便计算结果,图最好转置建立,即把a->b换成原创 2012-02-20 15:16:08 · 460 阅读 · 0 评论 -
USACO 1.1.1 Your Ride Is Here
为了鞭策自己把USACO通关,今天开始逐题写题解,写得不好,望大家指正!第一次写USACO,把格式搞错了好几次,汗。本题较水,把字符串写成字符数组,统计每一位的值的乘积,最后比较模47的结果是不是与“彗星”模47的结果一样,一样则输出“GO”,否则输出“STAY”。代码如下:/*ID: michael139LANG: CPROG: ride*/#include#原创 2012-02-20 15:48:35 · 403 阅读 · 0 评论 -
USACO 1.1.2 Greedy Gift Givers
纯模拟,刚开始我把题意看错了,以为遇到0 0就终止,WA多次。其实题意是要接受NP组数据(NP是总人数),对每组数据进行简单处理就可以,不再赘述。代码(普通查找O(n)):/*ID: michael139LANG: CPROG: gift1*/#include#includetypedef struct { char name[20]; int mon原创 2012-02-20 17:26:40 · 744 阅读 · 0 评论 -
USACO 1.1.3 Friday the Thirteenth
比较简单,直接模拟,需要注意闰年的判断和对不同月份日期的处理。代码如下:/*ID: michael139LANG: CPROG: friday*/#include#includeint is_leapYear(int y);int main () { FILE *fin = fopen ("friday.in", "r"); FILE *fout原创 2012-02-20 19:17:55 · 324 阅读 · 0 评论 -
USACO 1.1.4 Broken Necklace
模拟题,遍历项链,选择断点,然后双向搜索,应该注意项链是循环的,为了避免重复搜索,用vis数组来标记搜索过的珠子。每次记录最大可以收集的珠子数,与最大值做比较。本题要注意断点为w时的处理方法,特殊地,当珠子全为w时,输出n(即项链长度)。代码如下:/*ID: michael139LANG: CPROG: beads*/#include#includeint main原创 2012-02-20 20:21:35 · 508 阅读 · 1 评论 -
USACO 1.2.1 Milking Cows
我写的方法比较笨,用了一个时间轴数组vis,若vis[i]==1,则说明第i~i+1秒之间有牛正在被喂奶,最后统计一下数组上连续1的最大长度和连续0的最大长度就可以。代码如下:/*ID: michael139LANG: CPROG: milk2*/#include#includeint vis[1000500];int main () { FILE *fin原创 2012-02-20 22:00:17 · 363 阅读 · 0 评论 -
USACO 1.2.2 Transformations
本题可以看作是一道几何题,定义了几种基本操作:1.顺时针旋转90度、2.180度、3.270度、4.绕竖直对称轴翻转、5.组合变换(先进行4,再进行1~3中任意一种)、6.不做改变。题目给定变换之前的图像和变换之后的图像,求让上述一种变换来实现(注意,仅仅是一种),如果有多种,输出编号最小的,如果无解,则输出“7”。代码写出来还是比较长的,不过思路很清晰。代码如下:/*I原创 2012-02-21 02:00:02 · 441 阅读 · 0 评论 -
HDOJ 4146 Flip Game
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4146有一个棋盘,有黑白两色棋子布满棋盘,黑色是b,白色是w。棋盘从左至右编号1~N,从上至下编号1~N,然后执行一系列命令(Xi,Xj),反转第Xi行和第Xj列,可以看出处在(Xi,Xj)这个点上的棋子被反转了两次,所以没变。题目要求输出执行一系列指令后棋盘上剩余的白子数目。题目数据原创 2011-12-20 13:24:09 · 483 阅读 · 0 评论 -
HDOJ 4143 A Simple Problem
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4143由于数据范围很大(1y^2 = n +x^2,平方差公式得:(y-x)*(y+x)=n接下来要做的就是把n因式分解,由于x不能为零(原文:please find the smallest positive integer x),故分解出来的两个因子必然不同,而且相差为2的倍数。然原创 2011-12-20 12:22:21 · 633 阅读 · 1 评论 -
HDOJ 1232 畅通工程
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1232赤裸裸的并查集,初始时有n个连通分量,每输入一组路线就进行一次并查集合并操作,最后统计剩余连通分量的个数count,所需的最少道路数为count-1。#includeint find(int x);void merge(int a,int b);int set[原创 2011-12-16 17:40:55 · 408 阅读 · 0 评论 -
Codeforces Div.2 213 C Matrix (预处理+哈希)
超级传送门:http://codeforces.com/contest/365/problem/C这场特别遗憾,A题题意看错WA了2次,C题溢出导致没能通过系统测试,如果C题过了就能排前30。题意是给你一个长度不超过4000的数字s,定义b[i][j]=s[i]*s[j],则可以得到一个矩阵b;又给你一个数a,求b有多少个子矩阵其和为a。例如:1012345a=10,原创 2013-11-20 21:16:14 · 902 阅读 · 0 评论 -
Codeforces Div.2 212 C Insertion Sort (DP)
超级传送门:http://codeforces.com/contest/362/problem/C这是一道以插入排序(Insertion Sort)为基础的动态规划题目,不熟悉插入排序请参考维基百科插入排序题目中给的插入排序代码如下所示:for (int i = 1; i < n; i = i + 1){ int j = i; while (j > 0 && a原创 2013-11-15 23:56:31 · 736 阅读 · 0 评论 -
线性时间复杂度字符串变换算法
在之前的一篇文章(百度2013年校招笔试题——pszStringRotate)中,我介绍了一种时间复杂度O(n),空间复杂度O(1)的字符串循环位移算法,其核心思想是交换和冲突处理。其实这只是线性时间复杂度字符串变换算法的一个特例——变换函数为f(x) = x + offset (offset为偏移,取全体整数)。倘若存在一个更一般的变换函数f(x),f(x)不一定是线性函数,甚至不可导或者不原创 2013-02-12 14:33:34 · 623 阅读 · 0 评论 -
百度2012年校招笔试题——pszStringRotate
百度2013校园招聘笔试题 算法与程序设计 第4题: 字符串左移,void *pszStringRotate(char *pszString, int nCharsRotate),比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n)。 字符串位移,再简单不过了,方法也很多. 有朴素算法(逐位移动,移动nCharsRotat原创 2012-11-01 23:15:18 · 2949 阅读 · 0 评论 -
HDOJ 1018 Big Number
超级传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1018这题没有公式没有想法,有公式超级简单。强烈要记住一样事情,计算某个数的位数的时候可以用到 log10(n)。这题暂时就放出找到的公式吧:公式1:log10(n!)=log1原创 2011-12-13 23:25:59 · 495 阅读 · 0 评论 -
HDOJ 1425 sort
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1425此题的特点:数据量大,但是数据的范围不大。用hash就行,hash函数就是减500000#includeint hash[1000100]={0};int main () { int n,m,i,a,count,max,first; while (sc原创 2011-12-14 14:39:55 · 829 阅读 · 1 评论 -
HDOJ 1021 Fibonacci Again
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1021本题数据范围很大,所以不能暴力,打表找规律即可。#includeint main () { int n; while (scanf("%d",&n) != EOF) printf("%s\n",(n+2)%4?"no":"yes"); return原创 2011-12-14 14:56:45 · 381 阅读 · 0 评论 -
HDOJ 1205 吃糖果
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1205思路:只要除了数目最多的糖果以外的其他所有糖果的数目之和加1(小心这里要用__int64或long long),大于等于数目最多的糖果数,就能吃完,否则不能。极限情况是:A*A*A*......*A*A*A (A代表数目最多的糖果,*代表其他糖果),这样无论*是什么,都可以满足题原创 2011-12-14 15:18:09 · 790 阅读 · 0 评论 -
HDOJ 1280 前m大的数
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1280由于NN*(N-1)/2是一个比较大的数,直接暴力求解必然TLE。不过题目中说了:每个数不超过5000,而且都是正整数,所以可以用hash来尝试一下。#includeint main () { int n,m,i,j,first,a[3003],hash[10010]=原创 2011-12-16 15:07:43 · 565 阅读 · 0 评论 -
USACO 1.2.3 Name That Number
思路:先把dict.txt中的名字都转化成数字,存储在数组中,便于查找。需要注意的是数字与字母的对应表里没有字母Q和Z,还有就是如果有多组满足题意,则都需要输出。代码如下:/*ID: michael139LANG: CPROG: namenum*/#include#includechar table[8][4]={"ABC","DEF","GHI","JKL","MN原创 2012-02-21 21:52:08 · 410 阅读 · 0 评论 -
USACO 1.2.4 Palindromic Squares
本题的关键是进制转换,如何将10进制数转换为B进制(2代码如下:/*ID: michael139LANG: CPROG: palsquare*/#include#includeint tenToB(int ten,char B[150],int b);int main () { FILE *fin = fopen("palsquare.in", "r");原创 2012-02-21 21:59:36 · 409 阅读 · 0 评论 -
Project Euler 26 Reciprocal cycles(计算有理小数循环节长度)
超级传送门:http://projecteuler.net/problem=26算法的核心思想:在除法过程中如果某一状态的除数与被除数和前面某一状态的相等,则后续的除法计算陷入循环,循环节长度就是这两个状态的距离。例子:计算1/7的循环节长度状态1: 10/7 得1余3状态2: 30/7 得4余2状态3: 20/7 得2余6状态4: 60/7 得8余4状原创 2013-01-15 14:47:14 · 1402 阅读 · 0 评论 -
Project Euler 38 Pandigital mutiples(枚举)
超级传送门:http://projecteuler.net/problem=38枚举每个排列,分别判断是否合法,最大的排列即为答案。注意从918273645开始枚举即可,因为这是题目中告诉的一组解,要找比这组解更大的才行。先枚举n的值,从2到9,再枚举要乘的那个数,记为x,枚举x的位数即可,1~4,x的位数不可能大于4,如果大于4,那么2x的位数必然也大于4,组合起来长度会大于原创 2013-01-17 21:29:26 · 495 阅读 · 0 评论 -
Project Euler 51 Prime digit replacements(枚举)
超级传送门:http://projecteuler.net/problem=51 这题我是暴力枚举的,O3优化后2秒多。先枚举素数,再枚举要替换的位置,我用二进制来表述,设dc为当前枚举到素数的位数,则替换方法可以从1 ~ (1 代码如下: #include #include #include using namespace std;int p原创 2013-01-25 19:16:00 · 982 阅读 · 0 评论 -
Project Euler 54 Poker hands(模拟+hash)
超级传送门:http://projecteuler.net/problem=54 刚看到题目描述,就联想到天津Regional的A题麻将那题,可惜没能AC,遗憾了好久。这题比麻将那题要简单一些,规则描述比较清楚,要比较两手梭哈牌的大小,我用了hash来存牌,定义了各种判定判断函数来进行判断。代码量还是比较大的,差不多600行,写的过程中很容易错。Unix/Linux设计思想——小即原创 2013-01-25 19:32:48 · 717 阅读 · 0 评论 -
POJ 2185 Milking Grid(二维KMP)
超级传送门:http://poj.org/problem?id=2185这道题网上很多其他的blog上的题解都是错的,由于题目自身数据比较水,便都混过去了。其中一种典型的错误解法是求出每一行/列的最小覆盖长度(ABCAB的最小覆盖长度就是3,即对应ABC),然后LCM,若结果大于串长,则取串长。这是一种典型的错误贪心,诸如:2 8ABCDEFABAAAABAAA这组数据原创 2013-02-23 18:29:32 · 1148 阅读 · 0 评论 -
POJ 1226 Substrings(KMP+枚举)
超级传送门:http://poj.org/problem?id=1226题意要求一个最长的串X,其或其反转串rev(X)在所有串中均出现过,输出X的长度。思路:先枚举第一个字符串的所有字串和字串的反转串,与剩下字符串进行串匹配,匹配过程中若二者有一个匹配成功则视为成功,从最长的字串开始枚举,第一个成功匹配的字串即为答案。代码(注意reverse函数调用的位置,我之前多调原创 2013-02-23 20:29:09 · 425 阅读 · 0 评论 -
HDOJ 4300 Clairewd's message(扩展KMP)
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4300本题题意是给你一个字符对应表,再给一个密文和明文相连接的串(明文后缀可能缺失),求补全后的串。比如样例:abcdefghijklmnopqrstuvwxyzabcdab为了方便,字符对应表是默认的。abcdab便是密文和明文相连接的串,记长度为m,我们需要找到分割点原创 2013-03-04 20:20:13 · 544 阅读 · 0 评论 -
HDOJ 4333 Revolving Digits(KMP+扩展KMP)
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4333本题需要注意一点,需要统计的只是不重复的数字,所以先要用KMP求出串的循环节,然后只取一个周期进行匹配就行。用扩展KMP进行匹配,母串为输入串的两倍扩展(便于表示循环位移),在匹配的过程中判断大小。代码如下:#include #include using n原创 2013-03-04 22:39:33 · 721 阅读 · 0 评论 -
ZOJ 3430 Detect the Virus(AC自动机+解码)
超级传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3430本题思路清晰,不过解码确实繁琐,看来自己代码能力还有待加强。需要注意几个点:解码后的ASCII字符的范围是0~255,而且可能包含'\0',不能用char来存,最好用int。代码:#include #include #原创 2013-03-13 20:21:01 · 1001 阅读 · 0 评论 -
Project Euler 20 Factorial digit sum(大数乘法)
超级传送门:http://projecteuler.net/problem=20用了自己写的大数乘法模板,乘法模板利用了这儿介绍的加法模板,注意设定内部tmp和ans数组的大小。#include #include #include using namespace std;void add(char* des, char* src){ char tmp[原创 2013-01-15 14:35:22 · 559 阅读 · 0 评论 -
Project Euler 13 Large sum(大数加法)
超级传送门:http://projecteuler.net/problem=13自己写的大数加法模板,用的时候注意设定tmp数组适当的长度,避免溢出或浪费空间。#include #include using namespace std;char num[150][51] ={ "3710728753390210279879799822083759024651原创 2013-01-15 14:30:12 · 753 阅读 · 0 评论 -
HDOJ 1754 I Hate It(线段树)
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754分析:用线段树来保存学生成绩,每次更新区间最大值即可。代码:#include#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn = 200000;char cmd[2];int原创 2012-08-11 23:44:58 · 477 阅读 · 0 评论 -
USACO 1.2.5 Dual Palindromes
此题可以利用1.2.4中所写的进制转换函数,题目本身没有太大难度,模拟即可。代码如下:/*ID: michael139LANG: CPROG: dualpal*/#include#includeint tenToB(int ten,char B[150],int b);int main () { FILE *fin = fopen("dualpal.in"原创 2012-02-21 22:40:41 · 312 阅读 · 0 评论 -
USACO 1.3.1 Mixing Milk
本题利用贪心算法即可求解。贪心策略:优先取单价最低的,直到数量足够。代码如下:/*ID: michael139LANG: CPROG: milk*/#include#includetypedef struct { int p,a;} Farmer;Farmer f[5050],temp;int main () { FILE *fin = f原创 2012-02-21 23:15:04 · 340 阅读 · 0 评论 -
USACO 1.3.2 Barn Repair
贪心算法。先用vis数组标记此栏里是否有牛(vis[i]==1表示第i栏有牛),然后用数组gap记录从此栏开始的最大空缺(比如X表示有牛,O表示没牛:XXOOOOXOX,编号从1开始。那么在这种情况下gap[2]==4,gap[7]==1,其他位置gap值均为0)。贪心策略:统计牛一共被分成了连续的几段(设有K个位置gap不为0,则牛被分成了连续的K+1段)。然后比较能提供的最大木板数m与K+原创 2012-02-22 00:47:41 · 363 阅读 · 0 评论 -
USACO 1.3.3 Calf Flac
题意:给定一个字符串(只考虑其中的'a'~'z'或'A'~'Z'),找出其中最长的回文,输出回文长度和原始的最短的包含该回文的字符串片段。数据的输入比较恶心,为此WA了好多次。题意要求测试文件里可能有多行数据,每行不超过80个字符,总共不超过20000个字符。找回文的时候,要把多行数据看成一行,找最长的,但输出的时候原来有换行的地方在回文里还是要换行,需要注意。代码如下:/*原创 2012-02-22 16:41:26 · 628 阅读 · 0 评论