ACM题解与经典算法
ACM题解与经典算法
远见望远
某985在读研究生,选定的研究方向为内核内存管理方向
展开
-
POJ 1002 题解
这个题目题意挺简单,就是给定一个字符串,按一定规则转化为给定格式的字符串。首先把字母转数字,再把数字相加成一个7位数,根据大小排序,对相同的数字计数,再控制输出每一位即可。易错点在于:字母转数字时很容易将Q和Z略过,但是数字相加的时候就容易忘记Q和Z的存在。在寻找相邻排列的相同数字时也要注意计数的方法。#include<iostream>#include<algori...原创 2016-10-30 11:08:00 · 99 阅读 · 1 评论 -
gym - 100952E 题解
题目大意:给定一个n*m的矩阵,要求放入数字1-l,并且给定的数对不可以在前后左右相邻,问有多少种方案题目解法:类似八皇后的解法,直接DFS枚举放入就好 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 us...原创 2017-08-11 09:42:00 · 57 阅读 · 0 评论 -
POJ 1001 题解
题意:求一个实数R的N次方解法思路:快速幂适用于整数计算,因此排除裸快速幂。题目中描述的R是一个固定长度的字符串,因此可以将小数点提取出来转换成一个整数来计算,完成后再用小数长度来确定小数点。计算N次方的时候发现N较小,所以可以使用高精度乘法来解决这个问题。#include<iostream>#include<string>using namespace std...原创 2016-09-29 21:12:00 · 96 阅读 · 0 评论 -
codeforces - 651A 题解
题意:有两个玩具,分别拥有a1的电量和a2的电量;两个玩具每分钟耗电量为2单位,如果有一个或两个的电量下降到1以下就停止游戏;有一个充电器,每分钟只能给一个玩具净充电1单位;问最大游戏时间长度。解法很简单,取贪心策略:每次充电给电量较低的玩具充电。大概想想就知道,如果要让游戏时间长度尽可能长,最好的方法就是让两者中电量较低的玩具的电量尽可能高题目做不出来往往是踩了这个坑:如果两个玩具开局电量...原创 2017-08-07 05:18:00 · 61 阅读 · 0 评论 -
hdu-1874 题解
裸SPFA模板题,注意算法中每次扩展完成后要把vis标记取消#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<climits>using namespace std;struct edgetype{ int ...原创 2017-08-07 08:40:00 · 71 阅读 · 0 评论 -
hdu - 1789 题解
题意:主角打完ACM比赛回来,有一堆作业要做,每个作业有自己的deadline和score,如果不能在deadline之前完成就拿不到这个作业的分数,问主角最多能拿多少分。题解:还是贪心策略,将作业按deadline顺序排序,用一个时间变量从前向后推,将作业逐个填入当天的内容中,如果当天的时间已经晚于该作业的deadline,就从前面的安排中找到一个可以完成该作业,且原安排的作业得分比该作业低...原创 2017-08-07 10:14:00 · 105 阅读 · 0 评论 -
codeforces - 723C 题解
题意:给定一个歌曲演唱的序列,第i个数字代表第i首歌由ai号乐队演唱;用最少的操作将这些歌改成1-m号乐队演唱,且每个乐队演唱歌曲数的最小值最大。问操作数问题解法:首先分析如何让最小值最大,有两种方式来提升最小值,第一种是将1-m范围外的乐队演唱的歌分给1-m范围内的演唱数最小的乐队,第二种是将1-m内演唱数较大的乐队的歌分一些给1-m内演唱数较小的乐队。所以题目的贪心策略也就基本确定了 ...原创 2017-08-07 06:11:00 · 73 阅读 · 0 评论 -
poj - 1700 题解
题意:N个人要过河,一个船最多承载两人,且过河速度等于船上划船速度最慢的人的速度,求过河的最短时间。题目解法:首先对题目进行分析,可以发现:船过了河还要有一个人再把船送回来。假设把人按过河速度从大到小排序并编号1-4,则会发现有两种过河方式:1.13一组,1回来,24一组,2回来,12一组,完成;2.12一组,1回来,13一组,1回来,14一组,完成。因此贪心策略就是:把人按过河速度从大到...原创 2017-08-07 08:16:00 · 82 阅读 · 0 评论 -
hoj - 1797 题解
题目还是挺简单的,经典的迷宫寻路问题。墙是红色块,路是黑色块,属于抵达终点的时间问题,由于二维平面,且没有过大的宽阔区域,适合DFS 1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 using namespace std; 5 bool map[22][22]; 6 ...原创 2017-08-09 16:42:00 · 74 阅读 · 0 评论 -
poj - 3984 题解
经典的迷宫最短路问题,DFS,BFS求解均可,DFS需要注意增加最短距离这个量来最优化剪枝和求解。BFS需要在状态里加入一个当前BFS树的深度。 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<climits> 5 #includ...原创 2017-08-09 16:45:00 · 60 阅读 · 0 评论 -
hdu - 4864 题解
大概题意:给定N台机器和M个任务,每个机器只能完成任务时间不大于机器最大工作时间且任务难度不大于机器最大任务难度的工作,每个工作的收益计算是500*xi+2*yi,其中xi表示第i项任务的所需时间,yi表示第i项任务的难度,问在保证完成任务数最大的情况下最高收益是多少题解:贪心策略,首先按任务的工作时间作为第一关键字降序排序,任务的难度系数作为第二关键字降序排序。对机器做相同的排序处理。对于每...原创 2017-08-07 16:33:00 · 81 阅读 · 0 评论 -
poj - 3258 题解
题目大意:给定一条直线上的石头位置,开头0位置和结尾L位置各有一块石头,问移走除结尾和开头外的m块石头后石头之间的最小间距最大为多少。题解:经典二分题目。二分的量是石头之间的最小间距。难点在于如何判断当前的二分状态是否合适,如果不合适,二分的量是过大还是过小。这里用到一点贪心的思路:如果开头石头是一定的,设我们当前的最小间距是mid,那么在0-mid区间内的石头将会被移走。所以我们判断的思...原创 2017-08-08 16:30:00 · 139 阅读 · 0 评论 -
codeforces - 377A 题解
题目大意:给定一个n*m区域,#为墙,“.”为空地,填充k片空地,同时使得剩下的空地继续保持连通题目解法:DFS遍历sum-k片空地(sum是空地总数),然后枚举一遍,没有被遍历过的空地全部填充 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<c...原创 2017-08-11 10:02:00 · 58 阅读 · 0 评论 -
poj - 2250 题解
题意:魔改版的LCS问题。序列是单词序列解法:原版LCS的序列元素是数字,想办法把数字替换成单词就解决了 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<string> 6...原创 2017-08-15 14:54:00 · 57 阅读 · 0 评论 -
poj - 3624 题解
裸01背包 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int v[3405]; 6 int w[3405]; 7 int f[13000]; 8 int main() 9 {10 int n,m;...原创 2017-08-15 14:55:00 · 97 阅读 · 0 评论 -
poj - 2533 题解
典型的LIS问题 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 int a[1001]; 6 int f[1001]; 7 int main() 8 { 9 int n;10 scanf("%d"...原创 2017-08-15 14:40:00 · 100 阅读 · 0 评论 -
poj - 1163 题解
数字三角形问题 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 int a[101][101]; 7 int f[101][101]; 8 int main() 9...原创 2017-08-15 14:42:00 · 67 阅读 · 0 评论 -
poj - 1231 题解
题目大意:在一个二维平面上放一些字母。每个字母数量相同,问能否画一些划分二维平面的直线,使得相同字符全部分布在一个区域,且该区域仅有这一种字符。题解:首先我们定义l,r,u,d四个数组,分别表示对某一个字符划分区域的左、右、上、下边界。然后分别对四个数组进行扩展:如果一个字符的左边界被包含在另一个字符的区域内,那么这个左边界就更新为包含区域的左边界,其他也相同。最后检查一遍两条坐标轴,如果存在...原创 2017-08-18 10:14:00 · 76 阅读 · 0 评论 -
codeforces - 106C 题解
混合背包问题 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<memory.h> 5 using namespace std; 6 struct datatype 7 { 8 int a; 9 int b;10 ...原创 2017-08-15 14:58:00 · 99 阅读 · 0 评论 -
SGU101题解
欧拉路径的解法见我的另一篇文章:http://www.cnblogs.com/shao0099876/p/7366852.html算法细节如下:读入边的数据,用sticktype存储,用vis标记解决输出时候的重复问题对于每一条边看做无向边,对于每一个顶点,其相邻顶点用next数组标记,因为顶点数少,且出现重边情况,所以用计数方法存储,amount存储顶点的度,vis标记用于判断图的连通性...原创 2017-08-16 08:27:00 · 64 阅读 · 0 评论 -
hdu - 1022 题解
题意:火车站有一个铁轨,出口和入口是同一个。给定火车入站序列,问能否调成成出站序列,如果能,输出出站操作。题解:模拟栈即可,如果栈空,则从入站序列取出首元素压栈,如果栈顶元素与出站序列首元素不同,则从入站序列取出首元素压栈,如果栈顶元素与出站序列首元素相同,则出栈,更新出站序列首元素。如果入站序列已空,而还在尝试取出首元素压栈,则判定为不能调整。 1 #include<iostrea...原创 2017-08-24 16:00:00 · 79 阅读 · 0 评论 -
hdu - 1237 题解
题意:给出一个数字计算式,包含+,-,*,/四种符号,计算值题解:最大坑点:不能仅仅判断第一个是0就结束计算,有可能有:0 + 1这样的情况所以1.判断第一个是否是0,如果是,则判断下一个符号是否是'\n'2.读入数字和运算符,如果是*,/,取出栈顶元素直接计算完成后压栈,如果是-,将数字相反数压栈,如果是+,将数字压栈。3.计算栈内元素之和 1 #include<iostre...原创 2017-08-25 08:58:00 · 68 阅读 · 0 评论 -
hdu - 1870 题解
题意:字母B被包含在第几层括号里?题解:遇到左括号就+1,右括号-1,遇到B输出值即可。 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 string s; 8 while...原创 2017-08-24 15:26:00 · 99 阅读 · 0 评论 -
hdu - 1213 题解
题意:给定朋友关系,是朋友的坐一个桌子,问需要多少桌子题解:并查集处理后看有多少组即可。 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int father[1001]; 6 int getfather(int x)...原创 2017-08-24 15:30:00 · 77 阅读 · 0 评论 -
hoj - 1448 题解
题意:三维迷宫,求逃出去的最短时间题解:用DFS最佳,注意vis存储最短距离 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<climits> 5 #include<cstring> 6 using namesp...原创 2017-08-11 14:05:00 · 72 阅读 · 0 评论 -
poj-1308 / hoj - 2120 题解
题意:给定一些结点之间的有向边(父子关系),问是否是一棵树题解:1.首先判定是否是空树,这个地方是个坑,容易漏判。2.判定树的根节点数量。3.从根节点开始搜索(我用的DFS),对找到的点打访问标记,如果出现重复访问就不是树。4.枚举结点,如果有没有被访问到的的结点说明不是树数据范围没给,但是亲测n不大于10000 1 #include<iostream> 2 #incl...原创 2017-08-14 09:53:00 · 102 阅读 · 0 评论 -
高精度运算
一、高精度加法 高精度加法是模拟竖式运算得来,总结如下: 1.对字符串进行预处理 2.两个数组对应位置分别相加 3.从低位到高位扫描一遍,超过进制的向上进位 4.如果最高位大于进制,则向上进位 1 string s1,s2; 2 int a[10001],b[10001],c[10001]={}; 3 int la,lb,lc; 4 void high_precis...原创 2017-08-26 14:02:00 · 93 阅读 · 0 评论 -
hdu - 1231 题解
题意:最大连续子序列问题+输出答案所在的区间题解:最大连续子序列问题状态转移方程:f[i]=max(a[i],f[i-1]+a[i]) 答案所在区间的话可以在递推求状态的时候,顺便记录一下当前位置所在的序列左端点是谁,最后扫描的时候记录下最优解的位置,然后这个位置就是右端点,记录过的数据就是左端点。 1 #include<iostream> 2 #include<...原创 2017-08-25 15:57:00 · 79 阅读 · 0 评论 -
codeforces - 544C 题解
题目大意:有n个程序员,第i个人一行代码的bug数为ai。公司要写m行代码,问代码中bug量不超过b的方案数对mod取余的结果。题解:把一个人写一行代码看作一个物品,这样就成了n类物品的完全背包问题,且有两个代价,一个是需要写的代码量m,一个是bug数b 1 #include<iostream> 2 #include<cstdio> 3 #include<...原创 2017-08-18 15:08:00 · 137 阅读 · 0 评论 -
poj - 3070 题解
题意:斐波那契数列的矩阵链乘求法。题解:快速幂优化矩阵链乘解决。 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 struct datatype 7 { 8 ...原创 2017-08-22 15:00:00 · 84 阅读 · 0 评论 -
codeforces - 448C 题解
题意:给定一个栅栏,每次涂一行或者一列,问最少几次能够涂完题解:分治算法+DP思想,每次的状态从竖着涂和横着涂中选择,同时向更高的部分递归计算。 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<climits> 5 using names...原创 2017-08-23 15:21:00 · 123 阅读 · 0 评论 -
codeforces - 148E 题解
题目大意:一个公主有一个摆满瓷器的架子,她生气的时候就要打碎m个瓷器。这个架子有n层,每层的瓷器每次只能从最左边拿或者从最右边拿,问打碎的瓷器的最大价值。题解:这是一个分组背包的DP,首先将每一层上拿出瓷器的方案作为一个物品,拿出瓷器的方案的代价是瓷器数量,价值是这一层上所有方案中最大的价值。首先为了计算方案的时候可以快速计算,我们在读入的时候就计算出前缀和sum,然后在计算方案的时候,每一...原创 2017-08-20 16:04:00 · 82 阅读 · 0 评论 -
poj - 3641 题解
题意:检验一个数是否是质数,且满足ap = a (mod p)题解:快速幂,质数检验 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 long long power(lon...原创 2017-08-22 13:17:00 · 108 阅读 · 0 评论 -
prim算法
https://en.wikipedia.org/wiki/Prim%27s_algorithm 1 int n,m; 2 struct edgetype 3 { 4 int from; 5 int to; 6 int len; 7 }; 8 struct pointtype 9 {10 vector<edgetype> next...原创 2017-08-29 16:02:00 · 65 阅读 · 0 评论 -
tarjan算法
https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm 1 struct pointtype 2 { 3 vector<int> next; 4 int col; 5 int lowlink; 6 bool vis; 7 }poin...原创 2017-08-29 16:35:00 · 56 阅读 · 0 评论 -
kruskal算法
https://en.wikipedia.org/wiki/Kruskal%27s_algorithm 1 struct edgetype 2 { 3 int from; 4 int to; 5 int len; 6 }edge[100001]; 7 int n,m; 8 bool com(const edgetype& x,const edge...原创 2017-08-28 11:02:00 · 61 阅读 · 0 评论 -
poj - 2976 题解
01分数规划 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 struct datatype 6 { 7 int a; 8 int b; 9 double c;10 }data[10001]...原创 2017-08-29 12:49:00 · 57 阅读 · 0 评论 -
拓扑排序
https://en.wikipedia.org/wiki/Topological_sorting 1 struct pointtype 2 { 3 vector<int> next; 4 int in; 5 }point[1000001]; 6 int n,m; 7 queue<int> q; 8 list<int> res...原创 2017-08-30 12:29:00 · 74 阅读 · 0 评论 -
线段树
1 struct pointtype 2 { 3 long long sum; 4 long long lazy; 5 }tree[500001]; 6 void push_up(int root) 7 { 8 tree[root].sum=tree[root*2].sum+tree[root*2+1].sum; 9 retu...原创 2017-08-30 12:40:00 · 55 阅读 · 0 评论 -
SPFA算法
https://en.wikipedia.org/wiki/Shortest_Path_Faster_Algorithm算法过程简述:变量定义:点集point,邻接表类型pointtype,dis是点的最小估计距离,next是点的邻接信息,vis是点的队内标记。q为队列。初始化:读入图信息,创建邻接表,起点最小估计距离设定 1 struct edgetype 2 { 3 i...原创 2017-08-28 10:36:00 · 51 阅读 · 0 评论