
ACM
tju_tonge
荆棘给我的挣扎,我咬牙还给它
展开
-
HDU 贪心专题
☀️下面整理了几道使用贪心算法的题目,从简到难。????一、HDU 4310 Hero题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4310题意为,每个Hero有DPS和HP两个属性,每个时刻都受到HP>0的敌人的攻击,而自己每个时刻只能攻击一个敌人,使其HP减一。问自己打败所有敌人消耗最小的HP量。贪心策略:需要首先消灭HP小且DPS大的敌人,因此我们按Hero的 DPS/HP 值从大到小排序,依次消灭。AC代码:#include <原创 2020-09-17 21:48:42 · 507 阅读 · 0 评论 -
HDU 动态规划专题复习
关于背包问题详见这篇blog,本文没有回顾背包问题。下面是动态规划的一些经典的问题。一、最大连续子序列和题目为从数组a[0] a[2]…a[n-1]中找出i, j,使得a[i]~a[j]这一段元素之和最大。状态转移方程为:dp[i]=max{dp[i−1]+a[i],a[i]}dp[i] = max \{dp[i-1] + a[i], a[i]\}dp[i]=max{dp[i−1]+a[i],a[i]},边界为 dp[0]=a[0]dp[0] = a[0]dp[0]=a[0]。代码由此可以很容易的写原创 2020-09-10 22:06:37 · 241 阅读 · 0 评论 -
HDU 递推专题
以下题目可使用递推算法求解。一、HDU 2802 F(N)题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2802AC代码:#include <stdio.h>#include <algorithm>using namespace std;//HDU Accepted 2802 15MS 1256K 332 B G++//学会找找循环解 __int64 f[110000];void init() { int i;原创 2020-09-07 15:10:36 · 262 阅读 · 0 评论 -
记忆化搜索
记忆化搜索与搜索不同之处在于,它把重叠的子问题的答案保存下来,相当于以空间换时间。下面两题是使用了记忆化搜索算法的题目。一、HDU 1078 FatMouse and Cheese题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078AC代码,具体见注释:#include <iostream>#include <cstring>using namespace std;int m[105][105];int dx[4]原创 2020-09-06 19:52:09 · 143 阅读 · 0 评论 -
HDU 二分图专题
今天学习了下二分图匹配,思路就是,先匹配着,不行就让之前的人想办法挪位置,挪不了了就结束。(今晚只做了一题,明天再做其他的再更新一、HDU 2063 过山车题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063代码如下,具体见注释:#include <iostream>#include <string.h>using namespace std;//HDU Accepted 2063 15MS 2404K 729B G+原创 2020-09-05 23:50:19 · 275 阅读 · 0 评论 -
洛谷 二分查找专题
叮!二分专题~~下面几个题都是二分法去做,可用以参考或开阔思路。一、P1918 保龄球题目链接:https://www.luogu.com.cn/problem/P1918题目描述:给出每个位置的瓶子数,输出一个发球位置,使得这个位置的瓶子个数刚好是需要的个数。思路:一眼可以看出来的二分,为了保存位置这一信息,加上个结构体就可以了。先排序,然后二分查找。需要注意的点:while循环的停止条件、出口、查找一次后的处理AC代码:#include <iostream>#include原创 2020-09-05 21:08:37 · 700 阅读 · 0 评论 -
数据结构——排序算法总结
一、插入排序插入排序是算法是每次将1个待排序的记录按其关键字大小,插入到前面己排好序的子序列中,直到全部记录插入完成。直接插入排序空间复杂度:仅使用了常数个辅助单元,O(1)O(1)O(1)时间复杂度:最好情况下为O(n)O(n)O(n),最坏情况为O(n2)O(n^2)O(n2)稳定性:稳定折半插入排序即先折半查找出元素的待插入位置,然后统一移动待插入位置之后的所有元素 。折半插入排序减少了比较元素的次数,这部分的复杂度为O(nlog2n)O(nlog_2n)O(nlog2n),而元素的原创 2020-09-03 16:40:46 · 187 阅读 · 0 评论 -
HDU 鸽巢原理
鸽巢原理把多于n+1个的物体放到n个抽屉里,则至少有一个抽屉里的东西不少于两件。把多于m*n+1(n!=0)个的物体放到n个抽屉里,则至少有一个抽屉里有不少于(m+1)的物体。把无数还多件物体放入n个抽屉,则至少有一个抽屉里有无数个物体。一、HDU 1205 吃糖果题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1205思路是,把数量最大的这一种类放在一堆,数量记为maxa,其他种类的糖果放在一堆,数量为sum-maxa。如果maxa >.原创 2020-09-02 21:08:45 · 232 阅读 · 0 评论 -
HDU 1200 字符串
不断补充:1.strlen()用法strlen()用于返回字符数组或字符串所占的字节数。该函数是从该字符串的第一个地址开始遍历,直到遇到结束符’\0’为止。返回的长度大小不包括’\0’。c/c++ strlen(str)和str.length()和str.size()都可以求字符串长度。2.reverse()用法reverse可以用于vector、string类型的变量,使用方法:string s;reverse(s.begin(),s.end()); //s已经是反转后的结果对于字符数原创 2020-08-30 16:46:19 · 194 阅读 · 0 评论 -
HDU 一道BFS两道DFS总结
昨天做了三道搜索题目,每个题目都各有特点,下面总结一下几个题。一、HDU 1728 逃离迷宫 BFS题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728这个题目是对转弯数做了限制,要求最小转弯数,因此使用BFS。我们用shortnum[MAXN][MAXN]数组表示到当前位置的最小转弯数。定义结构体node包含坐标、转弯数、走的方位。AC代码:#include <iostream>#include <string.h>#原创 2020-08-28 22:51:34 · 263 阅读 · 0 评论 -
HDU 1429 BFS+状态压缩
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429题目大意:魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。分析:题目中明确说明有a~j共10把钥匙,迷宫大小为n*m,我们可以设置一个三维数组status[MAXN][MAXN][1030]表示出各种状态,其中第前两维用来表示地图中的每个点,第三维表示获得钥匙的状态。数组值原创 2020-08-28 22:24:59 · 121 阅读 · 0 评论 -
HDU 欧拉回路、欧拉路径
四个重要定理无向图存在欧拉通路的条件:连通且只有两个顶点的度是奇数,其余都是偶数,或者无度为奇数的结点无向图存在欧拉回路的条件:连通且所有节点的度为偶数有向图存在欧拉通路的条件:连通且所有顶点的出度与入度都相等,或者除两个顶点外,其余顶点的出度与入度都相等,而这两个顶点中一个顶点的出度比入度之大1,另一个顶点的出度比入度小1。有向图存在欧拉回路的条件:连通且所有的顶点出度等于入度记住以上几个定理就好办了,下面是两个例题:一、无向图的欧拉回路题目链接:HDU 1878 欧拉回路根据如上定理原创 2020-08-25 23:07:04 · 199 阅读 · 0 评论 -
HDU 1873 优先队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873实现方式就是每个医生一个优先队列,IN进队,OUT出队。AC代码:#include <iostream>#include <queue>using namespace std;//2020-08-24 10:55:45 Accepted 1873 156MS 1432K 1202 B G++struct node{ int id; int rank; node(原创 2020-08-24 11:02:26 · 327 阅读 · 0 评论 -
ACM 前缀和
前缀和是一种重要的预处理,能大大降低查询的时间复杂度。我们可以简单理解为“数列的前 n 项的和”。下面是两道简单的前缀和题目一、一维前缀和题目链接:洛谷 P3406 海底高铁就像公路上限速标志一样,只会在一个路段开始和结束两个地点声明限速和解除限速,而不必在全程每一根柱子上都标明限速70。那么这个题使用前缀和后也是一样,不必在每条路上都标记走了多少次,而只需要在开始和结束出做加一和减一标记处理。这样我们就知道接下来经过的这条路是被经过了多少次,而到了减一的城市之后,接下来经过的路段就与之前的路.原创 2020-08-18 22:45:55 · 309 阅读 · 0 评论 -
动态规划——背包专题
背包问题是一类典型的动态规划问题,背包问题又分为:0-1背包、完全背包、多重背包这三类。本文将介绍这三种背包问题以及acm题目代码。其中多重背包部分有很多类型的变式,因此给出的题目较多。一、0-1背包0-1背包问题通常为:给定n个物品、每个物品的体积为w[i],价值为c[i]。(每个物品只有一件)背包的容量为V,问如何选取物品使得不超过背包的容量且所装总价值最大。一般的状态转移方程可以写为:dp[i][j]=max{dp[i−1][j]不放第i件物品dp[i−1][j−w[i]]+c[i]放第i件物原创 2020-08-17 21:48:44 · 211 阅读 · 0 评论 -
HDU 1242 /4460/1226/4474 BFS专题
广度优先搜索(BFS)是最简便的图的搜索算法之一。BFS属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。今天做了几道关于BFS的题,由简到难,记录一下。1. HDU 1242 Rescue题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242题目大意:Angel被抓了,地牢大小N * M,格子有四种类型:墙、路、守卫和营救Angel的朋友。每走一格需要1个.原创 2020-08-13 21:27:57 · 171 阅读 · 0 评论 -
ACM 树
一、二叉树节点的表示通常使用结构体表示。struct Node{ Node * lchild; //左子节点 Node * rchild; //右子节点 int c; //编号}Tree[1005];二叉树的三种遍历方式前序、中序、后序的遍历方式如下所示。void preOrder(Node *T) { //后序遍历 if(T->lchild != NULL) postOrder(T->lchild); if(T->rchild != NULL)原创 2020-08-12 21:16:55 · 246 阅读 · 0 评论 -
ACM 数论(一些定理及应用)
常用定理1. 欧拉定理(费马-欧拉定理)若n,an, an,a为正整数且n,an, an,a互素,则有如下公式: aφ(n)≡1a^{\varphi(n)} \equiv 1aφ(n)≡1 (mod n)含义: aφ(n)a^{\varphi(n)}aφ(n)与1在模n下 同余,其中φ(n)\varphi(n)φ(n)为欧拉函数,代表小于或等于nnn的正整数中与nnn互质的数的数目。举个栗子:a=3,n=5a=3, n=5a=3,n=5,小于5的正整数中与5互质的数为1,2,3,4,所以φ(5)原创 2020-08-11 10:29:47 · 372 阅读 · 1 评论 -
HDU 1285/2647/1811 拓扑排序
今天学习了拓扑排序算法,做了三道相关题目。一、1285 确定比赛名次一道纯拓扑排序,很简单,代码中有注释。#include <iostream>#include <vector>#include <queue>#include <stdio.h>#include <string.h>using namespace std;//HDU Accepted 1285 15MS 1440K 1051 B G++int n, m, a,原创 2020-08-09 22:42:51 · 129 阅读 · 0 评论 -
HDU 2112 使用优先队列优化Dijkstra算法
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2112使用优先队列优化的Dijkstra算法,其时间复杂度为O(ElogV)O(ElogV)O(ElogV)。无论是稀疏图还是稠密图,优化后的运行速度都要比朴素Dijkstra快。下面是几点需要了解的:在Dijkstra算法中,dis[i]越小应该越先出队。在STL中我们可以使用greater<int>表示大于运算符,写成priority_queue<int> , vector<原创 2020-08-09 13:14:33 · 362 阅读 · 0 评论 -
HDU 2544 最短路
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2544求工作人员从商店走到赛场的最短时间,也就是最短路问题。最短路问题的常用算法为Floyd算法、Dijkstra算法。下面依次介绍两种方法并给出代码。一、Floyd算法Floyd算法,中文叫做弗洛伊德算法,是解决任意两点间的最短路径的一种算法。可以处理有向图或负权图(但不可存在负权回路)。这种算法的时间复杂度是O(N3)O(N^3)O(N3),空间复杂度为O(N2)O(N^2)O(N2)。算法的原理与动原创 2020-08-08 21:25:35 · 280 阅读 · 0 评论 -
HDU 1301 初学最小生成树
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1301这是一道求最小生成树,可以分别使用Prim和Kruskal两种算法实现一、Prim算法朴素Prim的算法复杂度为O(n2)O(n^2)O(n2),更适合于稠密图对于Prim算法,还有一种优化方法叫堆优化,但是据说使用后提升不大,所以我暂时还没有学Prim堆优化这个方法。朴素Prim代码如下,详细步骤见注释#include <iostream>#include <string.h原创 2020-08-08 09:25:39 · 199 阅读 · 0 评论