
ACM
haozlee
多年linux开发经验,熟悉c++,python。个人主页:https://leehao.me
展开
-
动态规划求解最大字段和及其变种问题
动态规划(Dynamic Programming, DP)为一常用算法思想,本文讲述如何利用DP解决常见的最大字段和及其变种问题。一、 最大字段和问题问题定义设数组为a[k]a[k],1≤k≤n1 \le k \le n,最大字段和XX定义为:X=max1≤i≤j≤n{∑k=ija[k]} X=\max_{1\le i \le j \le n}\{\sum_{k=i}^j a[k]\} XX直观含义原创 2015-07-22 00:53:30 · 3920 阅读 · 0 评论 -
POJ-1002-487-3279-解题报告
很久之前就做过这道题了,只是当时一直TLE。其实当时也能得到正确答案,不过由于用了STL map这些东西,可能效率比较低导致TLE。今天彻底用C做出来了。#include #include #include const int MAX_CASE_SIZE = 100003;const int MAX_STD_PHONE_SIZE = 10;char phone[128]; //接原创 2011-03-11 20:42:00 · 1334 阅读 · 0 评论 -
ZOJ-2812-Quicksum-getline读入一行文本
第一天到ZOJ上刷题,上个水题的代码。#include using namespace std;int main(){ string packet; while(getline(cin, packet)) { if(packet == "#") break; //cout << packet.size() <原创 2011-07-08 09:35:40 · 1578 阅读 · 0 评论 -
动态规划求解最大字段和及其变种问题
作者:lihao21版权所有,转载请标明出处。动态规划(DP)为一常用算法思想,本文讲述如何利用DP解决常见的最大字段和及其变种问题。一、 最大字段和问题问题定义设数组为a[k],1≤k≤n,最大字段和X定义为:X直观含义即,求任一连续字数组的最大和。 问题分析不妨设:b[j]的直观含义为,以a[j]为结束元素的连续数组的最大原创 2012-01-28 09:18:30 · 5342 阅读 · 1 评论 -
POJ 1218 THE DRUNK JAILER解题报告
挺水的一道题,就是给定一大小为n的数组,第一趟令所有监狱为0,表示所有的监狱都打开,接着第二趟令第2,4, 6……个监狱关闭,第三趟令第3,6,9……个监狱关闭,第四趟………一直到第n趟。若在遍历过程中,发觉监狱已经关闭,则令其打开;发觉监狱已经打开,则令关闭。最后再遍历一次数组,求得有几个监狱找打开,以还有几个数组元素为0,输出即可。 代码:#include #define原创 2010-12-20 13:55:00 · 1021 阅读 · 0 评论 -
POJ-2141-Message Decowding-解题报告
注意运用getline函数来获得一行字符串。 #include #include #include using namespace std;int main(){ string keyStr, msgDecStr, aLine; getline(cin, aLine); keyStr = aLine; const char *key = keySt原创 2010-12-20 23:43:00 · 965 阅读 · 0 评论 -
POJ-2159-Ancient Cipher-解题报告
题意是说第一行字符串能否由第二行字符串经过“替代”和“位置转换”后得到。做题时,实际上只统计两个字符串的各字符出现的“次数”是否相同即可(不必计较这相同次数是否字符也相同)。 算法思想如下:1)读入两行字符串;2)分别统计这两行字符串中每个字符出现的次数,并将其结果存在num1[26], num2[26]数组;3)对上述两个数组进行降序排序;4)比较两个数组是否相同:若原创 2010-12-21 10:54:00 · 1015 阅读 · 0 评论 -
百练-2754-八皇后-解题报告
描述会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。给出一个数b,要求输出第原创 2010-12-31 11:48:00 · 1768 阅读 · 0 评论 -
2909 Goldbach's Conjecture 解题报告
主要是注意优化,感觉下面的代码还不是最优的,运行时间还要几百ms. #include #include #define MAX_SIZE 32768int primeArr[MAX_SIZE];/*判断一个大于等于2的整数是否质数*/bool isPrime(int n) { /*注意结束条件*/ for(int i = 2; i <=sqrt(n); i+原创 2011-01-01 11:47:00 · 882 阅读 · 0 评论 -
POJ 2418 Hardwood Species 解题报告
同样是map的使用。map真是强大,看了discuss的代码后,才知道自己用了map后是多么的方便。#include #include #include using namespace std;int main(){ map species; int totalTrees = 0; string name; while(getline(cin, nam原创 2011-01-07 13:17:00 · 1218 阅读 · 2 评论 -
POJ 1862 Stipies 解题报告
题意很简单,就是给定你一系列的数值,任意挑选其中两个数a和b,得到一个新的数2*sqrt(a*b),然后再将这个新的个放回。一直这样下去,直到只剩下一个数。求剩下的这个数最小是多少。使用贪心策略,不断挑选两个最大的数组成一个新的数并放回原数列,再挑选最大的两个数……最到只乘一个数为止。 根据以上分析,知道使用C++STL中的priority_queue很简便。以下是代码:#in原创 2011-01-08 19:26:00 · 1020 阅读 · 0 评论 -
POJ 2255 Tree Recovery解题报告
第一个完全由自己想出来的递归程序,嘿嘿。 #include #include using namespace std;/*核心函数。递归实现。 *preStr为先序遍历串,inStr为中序遍历串。 *假设preStr为“BCAD”,inStr为“CBAD”。 *则先找到根为”B“,根的左孩子为”C“,右孩子为”AD“。 *然后递归调用postStr,得到左孩子和右孩子的后原创 2011-01-17 10:00:00 · 810 阅读 · 0 评论 -
POJ-2051-Argus-sort水过
用堆或者priority_queue应该更好。解决此题关键是要注意每次输出后各个query的period如何变化:输出的那个要恢复为原来的;其余的则减去已经逝去的时间。代码:#include #include #include #include using namespace std;const int MAX_SIZE = 1005;struct Query {原创 2011-03-09 16:41:00 · 1291 阅读 · 1 评论 -
POJ-3624-Charm Bracelet-简单0/1背包、动态规划、DP
简单的0/1背包问题,用动态规划即可简单求解。以下一段话摘自Slyar.==========================================================Slyar:标准的01背包,动态转移方程如下。其中dp[i,j]表示的是前i个物品装入容量为j的背包里所能产生的最大价值,w[i]是第i个物品的重量,d[i]是第i个物品的价值。如果某物品超过背包容量原创 2011-03-06 19:42:00 · 2105 阅读 · 0 评论 -
POJ-3349-Snowflake Snow Snowflakes-hash
第一次用hash解题。这道题早就想A了,只是觉得挺难,便一直放下。今天本想下定决心自己做出来的,没想到自己写的代码一直WA,相当恼人。最后参考了网友的程序,虽要3454MS,但总算也过了。解决此题的关键有二:1. 构造hash表,应能想到hash表项存储的是雪花数组下标。其实hash表项设定为vector挺好用的,当hash表项存储的元素增加时,直接push_back即可,vector原创 2011-03-06 16:51:00 · 1424 阅读 · 0 评论 -
POJ-1338-Ugly Numbers-丑数
去年十二月份就已经做过了这道题。当时只是做出来,还来还没有完全理解。这不,三个月后的今天,竟忘记了。这两天看到不少面试题都喜欢拿这道题提问,于是,我便重新看了以前写的代码。其实理解应该不算太难。就是一个数列,里面的数的因子只有2,3,5,并且这个数列按照从小到大的顺序排列。设ugly[]数组保存这个数列,这样,可以设三个指针p2,p3,p5,分别指向数列中的三个数(可以相同),取ugly[原创 2011-03-18 13:27:00 · 1984 阅读 · 0 评论 -
POJ-1028-Web Navigation解题心得
这道题是目前为止本人做到的最难的题。这道题只要是练习下stack的使用,另外,对于C++中STL的使用也有一定的涉及。(当然,这些数据结构是可以自己实现的,不过为了节省时间,我直接使用了。) 题意是很容易理解的,就是编程模拟实现浏览器的“前进”,“后退”功能。且题目中已说明了如何使用stack 进行编程,应该不算难的。 解决这道题主要遇到的问题:1)对于当前URL的初始化,“后原创 2010-12-18 15:18:00 · 1541 阅读 · 0 评论 -
POJ 2017 Speed Limit解题报告
很简单的一题,直接上源码。 #include #include #include #define MAX_PAIRS_SIZE 11int pairs[MAX_PAIRS_SIZE][2];int main(int argc, char *argv[]){ pairs[0][0] = 0; pairs[0][1] = 0; while(1) {原创 2010-12-20 11:40:00 · 970 阅读 · 0 评论 -
POJ 1207 The 3n + 1 problem 解题报告
主要遇到问题:1)开始时不会使用使用:while(scanf("%d%d", &a, &b) == 2)来判断输入是否结束;2)在for循环内,直接使用i变量,而没有用一个变量保存当前所要求cycle length值的数,导致出错;3)被题目“阴”了一下,输入实际上的两个数是有可能“第一个数大于第二个数”的。 解决了以上问题,实际上本题也是一水题。 #include原创 2010-12-20 16:03:00 · 1069 阅读 · 0 评论 -
POJ 2840 Big Clock 解题报告
若用C++编程,主要实现“根据‘:’分段提取字符串”,并根据字符串转换成相应的数值。 #include #include #include using namespace std;int main(){ int T; cin >> T; string timeStr; string H; string M; for(int i原创 2010-12-20 22:06:00 · 1130 阅读 · 0 评论 -
POJ 3302 Subsequence 解题报告
一道水题,就是自己在输出时没有注意,将“YES”写成“Yes“,贡献了两次WA。 #include #include #include using namespace std;/*判断str2是否str1的字串*/bool isSubStr(string str1, string str2) { char c; string::size_type pos = 0;原创 2011-01-02 00:42:00 · 1116 阅读 · 0 评论 -
POJ-2386-Lake Counting-解题报告
跟“红与黑”那道题很相似,都是用递归思想解决。这道也是自己独立解答出来的,一次就AC了,很有些成就感啊。 #include using namespace std;const int MAX_SIZE = 100;/*表示田地的矩阵,全局数据*/char field[MAX_SIZE][MAX_SIZE];int n, m;/*核心递归函数。 *输入:矩阵坐标i原创 2011-01-22 19:02:00 · 3684 阅读 · 0 评论 -
POJ-1065-Wooden Sticks-贪心-多关键字排序
第一次用STL的sort进行多关键字进行排序。另外,排序后再如何处理,有一定难度。 #include #include using namespace std;const int MAX = 5000;/* Stick类 */class Stick { public: int length; //长度 int weight; //重量 bool原创 2011-01-29 12:16:00 · 5908 阅读 · 0 评论 -
POJ-1007-DNA Sorting-求逆序数
之前看过这题道,由于当时对如何使用STL的sort还不熟悉,而自己又想偷懒,故没有做下去。今天看了《C++标准程序库》对sort有了一定的认识,便A了这道题。 经典的求逆序数的题,只是我是用暴力求解的。《算法导论》第二章的习题上面也有类似的题。看来还得研究下。 #include #include using namespace std;/*表示DNA的类*/class D原创 2011-01-29 16:04:00 · 1347 阅读 · 0 评论 -
POJ-1579-Function Run Fun-递归,记忆化搜索
再次验证了在递归过程中,使用“记忆化搜索”很有利于提高效率。POJ上“记忆化搜索”的讲解另参见:POJ-1088-滑雪-解题报告-动态规划-记忆化搜索 #include using namespace std;const int MAX_SIZE = 21; //按照题意,用一个三维数组存储结果时,最大时用到result[20][20][20]即可int result[M原创 2011-02-11 21:34:00 · 1567 阅读 · 1 评论 -
2299-Ultra-QuickSort-交换相邻两个数排序-求逆序对个数-合并排序
此题跟1804-Brainman相似,不过数据更强了。1840可以用暴力求解(时间为O(n^2)),而这道则不行。 题意:给出一组数,通过不断交换两个相邻的数,可以使这组数按非递减顺序排列。问,最小的交换次数是多少?分析:设一组数存储在A[](初始状态 ),若A[i] > A[i+1],则交换这两个数。这一操作只会使逆序对个数减少1,对于这两个数左右两端的逆序对个数没有影响。如此,不断原创 2011-02-12 14:34:00 · 3319 阅读 · 0 评论 -
POJ-3325-ICPC Score Totalizer Software-解题报告
题目比较简单。思路:读入一组分数,去除最高和最低分,再求余下分数的平均分即可。实现:用STL的vector很方便,接着用到sort算法,自己也不用写快排了。收获:发现将变量的声明放在循环体while内,时间会不所增加;而放在外面效率则高些。代码一:/*Memory: 716K Time: 0MS */#include #include #include usin原创 2011-01-20 22:57:00 · 1483 阅读 · 0 评论 -
POJ-3210-Coins-解题报告
题意:给定n个硬币,进行x次翻转,每次只能翻转一个硬币,且每个硬币可被翻转多次。问:对于所有初始情况下的硬币(即正反面的硬币数不一样),直少需要翻转几次才能达到所有硬币均处于同一面的状态。分析:1. n为偶数。1)若所有硬币均处于同一面,最小翻转次数x一定是偶数。2)若不是所有硬币均处于同一面,则一定是以下两种情况:i. 正面数为奇,反面数也为奇。最小翻转次数一定为奇。原创 2011-01-26 10:54:00 · 1716 阅读 · 0 评论 -
百练-2756-二叉树-解题报告
题目:=================================================================================描述 如上图所示,由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结点(编号是1的结点)都有一条唯一的路径,比如从10到根结点的路径是(10, 5, 2, 1),从4到根结点的路径是(4, 2,原创 2010-12-29 09:56:00 · 2039 阅读 · 0 评论 -
POJ 1979 Red and Black 解题报告
《程序设计导引及在线实践》上面有这道题,练习了递归的思想。 #include const int MAX_BRICK_SIZE = 20;/*用来存储方块符号信息*/char bricks[MAX_BRICK_SIZE + 1][MAX_BRICK_SIZE + 1];int W, H;/*递归调用的函数。 *假设以(i, j)为起点,则总的可以经过的黑瓷砖数为: *原创 2010-12-31 15:49:00 · 1056 阅读 · 1 评论 -
POJ 2403 Hay Points 解题报告
/*这道题主要练习了map的使用。 *使用map来操作,使得该题很简单。 */#include #include using namespace std;int main(){ map dic; //用来保存数据字典 map desc; //用来保存描述 typedef map::value_type valType; int m, n; ci原创 2011-01-07 12:13:00 · 1321 阅读 · 0 评论 -
POJ 1401 Factorial 解题报告
以下是算法的直观解释。假设求60!的结果后面有几个0。由《编程之美》可知其实是求1,2,3……60中共有几个5的因子,如,5有一个,10有两个,……一起加起来即得到结果。但是如果一个一个这样计算下去,会超时的。其实还有更简单的计算方法。我们知道,在1->60的数中,以下的数可以被5整除:5,10,15,20,25,30,35,40,45,50,55,60共60/5 = 12原创 2020-03-04 08:22:15 · 1108 阅读 · 0 评论 -
POJ 1611 The Suspects 解题报告
题意就不说了,看了discuss知道用并查集求解。由于之前没写过并查集,所以找了一本《数据结构》的书复习了下。然后按照书本的描述来写并查集。没想到在POJ提交代码时却出现了个怪异的现象,老是TLE。参考网上的解答,改啊改,快崩溃时终于AC了。真是奇怪,为什么把“判断两个元素的双亲”放在主函数就TLE了呢,而一定要放在unionSet?下面是两个版本的代码。代码一运用了“平行原创 2011-01-09 16:13:00 · 1517 阅读 · 1 评论 -
POJ 1833 排序 解题报告
晕。没想到用cin,cout的效率这么低,而一定要改用scanf和printf。另外,还一定要用C++而不能用G++才不会TLE。用C++ STL的next_permutation很简单。 #include #include using namespace std;/*通过int数组读入序列,而不使用string。 *因为,如果遇到两位数,三位数,则很难将它们 *看成一个原创 2011-01-09 22:21:00 · 1350 阅读 · 0 评论 -
POJ 3518 Prime Gap 解题报告
简单的一道题。直接上代码。#include #include using namespace std;bool isPrime(int n) { /*由于题目设定输入大于等于2,故不用再判断小于2的情况。*/ for(int i = 2; i <= sqrt(n); i++) { if(n % i == 0) return fa原创 2011-01-20 15:35:00 · 1002 阅读 · 0 评论 -
POJ-1163-The Triangle-动态规划
简单说下题意:已知多个数字组成一个三角形,从顶点开始,对角地下移,一直到底层,形成一条路径,对该路径上所有元素求和,求这个和Sum最大是多少。 /*动态规划求解。算法复杂度为O(n)。 */#include using namespace std;const int MAX = 5055;int arr[MAX]; //用一维数组存储三角形的元素值int dp[MAX];原创 2011-01-31 20:48:00 · 923 阅读 · 0 评论 -
POJ-1503-大整数加法
用一个int数组存储大整数,运行小学生使用的竖式运算进行模拟。#include #include using namespace std;const int MAX_SIZE = 105;int digits1[MAX_SIZE]; //在digits1在存放结果int digits2[MAX_SIZE];int main(){ string s; cin >原创 2011-03-08 20:05:00 · 1907 阅读 · 0 评论 -
POJ-1250-Tanning Salon
题意参考了Discuss里面的。如:2 ABBAJJKZKZ2代表有俩个座位,第一个A代表A来了,第一个B代表B来了,第二个B代表B走了,第二个A代表A也走了。字母代表顾客,当字母第一次出现的时候代表这个顾客来了,第二次出现代表该顾客走了,如果顾客是在没接收salon的时候就走了,公司的损失数就加一。解决方法用了两个string存储“正在享受服务的人员”和“不能享受服务的人原创 2011-03-14 22:40:00 · 1574 阅读 · 0 评论 -
POJ-2533-Longest Ordered Subsequence-最长递增子序列-动态规划
题意就不说了,就是给出一数列,要求其最长递增子序列的长度。状态转移方程为:dp[i] = max(1, dp[j] + 1), 0 代码#include #include using namespace std;const int MAX_SIZE = 1005;int a[MAX_SIZE]; //存储输入int dp[MAX_SIZE]; //a[0..i]的最长原创 2011-03-15 22:16:00 · 2163 阅读 · 0 评论 -
百练-2746-约瑟夫问题
题目如下:=====================================================================================描述 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,原创 2010-12-28 11:52:00 · 1279 阅读 · 0 评论