随笔分类 - ACM练习题
摘要:题意: 思路:对每个输入的点跑一遍dijkstra算法,然后对这个点到所有点的距离求和按公式输出就可以了。 (这次尝试了用数组模拟链表来做最短路问题,刷新了自己对最短路的理解) 这里构造链表的过程我的理解一直有误差,第一行的式子中参与代码构建的是Next[cnt] = head[y];head[y]
阅读全文
摘要:题意: 思路: 读完题目之后的第一思路就是用map将客户的id(string类型)与里程road(int类型)形成映射,然后直接用id查找添加里程或输出里程。但是400ms的限制妥妥的超时了。然后意识到要用哈希做,但是用哈希就有一点不好解决,每个客户的里程怎么保存,考虑了很长时间无果,搜了一下博客,
阅读全文
摘要:题意: 小w不会离散数学,所以她van的图论游戏是送分的 小w有一张n个点n-1条边的无向联通图,每个点编号为1~n,每条边都有一个长度小w现在在点x上她想知道从点x出发经过每个点至少一次,最少需要走多少路 思路:从当前位置开始dfs深搜,注意已经搜过的上一个点就不要搜了不然就成死循环了。 确实是个
阅读全文
摘要:题意:一个强盗要抢劫银行又不想被抓到,所以要进行概率分析求他在不被抓的情况下能抢最多的钱。他给定T(样例个数),N(要抢的银行的个数),P(被抓的概率要小于P)Mj(强盗能抢第j个银行Mj元钱),Pj(强盗抢第j个银行被抓的概率为Pj)。 思路:被抓的概率不好直接求出来,但可以直接求出不被抓的概率,
阅读全文
摘要:题目: 思路: 二维dp,完全背包,状态转移方程dp[i][z] = max(dp[i][z], dp[i-1][z-a[j]]+b[j]),dp[i][z]表示在杀i个怪,消耗z个容忍度的情况下获得的最大的经验值。 刚看到这个题一直把思维限制在一维dp中,总是不能表达全部的条件,然后想到二维d
阅读全文
摘要:题目: 题意: 让求给出的序列中连续的一个子序列的和的最大值,以及这个子序列的起点和终点。 思路:dp求当前位置的最大值,dp[i] = max(dp[i-1], a[i]);最大值的位置就是终点,既然知道了和的大小,那么,只要找出那个区间的和是该值就可以了,这里可以用一个前缀和数组来求开始的位置。
阅读全文
摘要:传送门:HDU_1087 题意:现在要玩一个跳棋类游戏,有棋盘和棋子。从棋子st开始,跳到棋子en结束。跳动棋子的规则是下一个落脚的棋子的号码必须要大于当前棋子的号码。st的号是所有棋子中最小的,en的号是所有棋子中最大的。最终所得分数是所有经过的棋子的号码的和。 思路:读完题之后知道这是一个最长上
阅读全文
摘要:首先得明白一个概念:子序列不一定是连续的,可以是断开的。 有两种写法: 一、动态规划写法 复杂度:O(n^2) 代码: 1 #include <iostream> 2 #include <queue> 3 #include <cstdio> 4 #include <algorithm> 5 #inc
阅读全文
摘要:题目: 思路:针对四种排序方法构建四个结构体,按四种排序排完之后,把结果汇总到代表国家的一个结构体中。然后就是查询就是了。排序规则可通过下面的例子了解一下: 序列:g[0] = 1,g[1] = 2,g[2] = 2, g[3] = 3; 排名:1 ,2 ,2 ,3(并不是1,2,3,4) 代码
阅读全文
摘要:一场比赛让自己看到了学了这么长时间,竟然还有这么多落下的东西。 区间DP,通过先求小区间的最优解,然后通过小区间的最优解来得到大区间的最优解。 区间DP板子 1 for(int len = 2; len <= N; len++)//枚举区间的长度,长度是从2开始的,从一开始是貌似没什么意思 2 fo
阅读全文
摘要:DP-01背包问题例题 输入处理有点恶心人,不过处理完后就是简单的DP了 从头开始dp[i]表示从0开始到i的最优结果,最后从都边里dp数组,求得最大的报销额。 对于每个i都要从头维护最优结果。(二刷感觉仍不得dp精髓,,,,) HDU-1864最大报销额 1 #include <iostream>
阅读全文
摘要:超级传送门 题目描述: 晨晨在纸上写了一个长度为N的非负整数序列{ai}。对于这个序列的一个连续子序列{al,al+1,…,ar}晨晨可以求出其中所有数异或的结果 alxoral+1xor...xorar其 中xor表示位异或运算,对应C、C++、 Java等语言中的^运算。小璐提出了M个询问,每个
阅读全文
摘要:传送门 在看大佬的代码时候遇到了unique函数以及二分查找的lower_bound和upper_bound函数,所以写这篇文章来记录以备复习。 unique函数 在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重
阅读全文
摘要:一、巴什博奕: 只有一堆n个物品,两个人轮流从中取物,规定每次最少取一个,最多取m个,最后取光者为胜。 结论: 见代码 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #defin
阅读全文
摘要:sub[ ]代表子串,str[ ]代表原串,next[ ]代表当sub[i] != str[j]时,子串需要跳到的地方,实现代码如下: 获取next数组的代码: 1 void GetNext()//求子串中的相同的真前缀和真后缀 2 { 3 memset(next, 0, sizeof(next))
阅读全文
摘要:原理: 举个例子来说明康拓展开的应用: 已知1,2,3,4,5五个数的全排列,给出一个排列34152,问该排列在全排列中是第几个。而康托展开的值就是这个排名。 首位是3,比它小而且没有出现过的数有1,2两个,所以为 2 * 4!; 第二位是4,比它小而且没有出现过的数有1,2两个,所以值为 2 *
阅读全文
摘要:用树状数组,在存数据的时候下标应该是从1开始的; 再求区间的和的时候和前缀和一样开始的下标是要减一的; toSum(int x)中再求前缀和的时候是倒着向前走的; 树状数组讲解:http://www.cnblogs.com/jinkun113/p/4725420.html ORZorzorz一看就明
阅读全文
摘要:查找该字符串是不是已经出现过 1 //在给出的字符串中查找当前字符串是否出现过 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 #include <cstdio> 6 #include <cmath> 7 #in
阅读全文
摘要:自己对Dijstra算法的理解是: 首先输入保存点,边的权值(注意无向图和有向图在保存时的区别)。 将表示从起点st到顶点 i 的距离的d[ i ]数组的每一个值初始化为INF,令d[st] = 0。 遍历d[ ]数组的下标 i (即顶点 i)这个操作是通过优先队列来实现的,然后遍历以顶点 i 为起
阅读全文
摘要:可以求得任意两点之间的最短路问题 1 int d[maxn][maxn];//d[st][en]表示边e = {u,v}的权值(不存在时设为INF,d[i][j] = 0) 2 int V;//顶点的个数 3 4 void Floyd() 5 { 6 for(int k = 0; k < V; k+
阅读全文

浙公网安备 33010602011771号