洛谷
小丑小丑小丑
这个作者很懒,什么都没留下…
展开
-
洛谷P4715淘汰赛
淘汰赛 考点:树的后序遍历或者模拟 这道题有两种思路,第一种是树的后序遍历,第二种是模拟。 后序遍历: 画出比赛的过程后我们发现这是一颗满二叉树。因此也符合完全二叉树的特点(根节点为编号1) left_child = parent * 2 right_child = parent * 2 + 1 而且我们发现,比赛的过程是从下自上的,且是先比较左右节点的能力值大小,再决出胜负的(决出根节点是谁)。 这就是后序遍历的顺序,因此我们按照后序遍历的写法 dfs(左子树) dfs(右子树) 操作 注:读取题目提原创 2022-03-04 12:40:26 · 186 阅读 · 1 评论 -
洛谷p1160 队列安排
队列安排 考点:数组双链表 用数组写链表的好处在于,可以让查找是时间复杂度变成O(1)。如果用stl的list来查找,时间复杂度是O(n)。 注:有些人可能想用迭代器加上一个整数去找到目标元素的地址。然而很明显是行不通的。链表是离散存储的,因此链表的迭代器不像vector,不能加上整数 双链表模板:用哈希或者数组存放下标和值的映射,使查找复杂度为O(1) 我这里用了unordered_map #include <iostream> #include <unordered_map> u原创 2022-03-03 17:30:18 · 539 阅读 · 0 评论 -
洛谷p1996 约瑟夫问题
约瑟夫问题 考点:队列 规则:逢报数为m的被淘汰。淘汰后又重头开始报数。 思路:先把所有人入队。前m - 1个出队后又入队。淘汰第m个,然后重复此操作。直到队列为空 ac代码: #include <iostream> #include <queue> using namespace std; int main() { int n, m; cin >> n >> m; queue<int> q; for(int i = 1; i <原创 2022-03-02 09:35:23 · 285 阅读 · 0 评论 -
洛谷P3654 Fisrt Step
题目链接:First Step 知识点:直线dfs 直线dfs的意思是沿着一条路一直走到底,不会转弯。 这道题里面就是让你向右或者向下直线dfs。 向下dfs void down(int x, int y) { if(满足结束条件) { 做你要做的事情; return; } int newx = x + dir[0][0], newy = y + dir[0][1];//向下 if (newx >= 0 && newx < n && newy &原创 2021-12-17 16:44:30 · 220 阅读 · 0 评论 -
洛谷P1088火星人
题目链接:火星人 知识点 next_permutation的使用。注:C语言里面没有这个函数。 next_permutation是求一个序列的全排列中,比当前序列字典序稍大的一个序列(唯一)。 例如 1 2 3 4 5 的next_permutation是1 2 3 5 4,再来一次next_permutation是1 2 5 3 4. 假若一直进行next_permutation的话,会直到变成 5 4 3 2 1(当前序列字典序最大的情况) 本题题意就是一个序列在全排列中按照字典序的大小来排序,映射成1原创 2021-12-16 23:38:13 · 1013 阅读 · 0 评论 -
洛谷p1036选数
题目链接:选数 知识点:组合型枚举 这里写递归型组合型枚举 递归搜索树如下: 递归组合型枚举模板 void dfs(int u,int start) { if(u == m) { for(int i = 0; i < m; i++) printf("%d ",path[i]); printf("\n"); return; } for(int i = start; i <= n; i++) {原创 2021-12-14 22:39:57 · 239 阅读 · 0 评论 -
洛谷P1012猜数
题目链接:猜数 知识点: 如果字符串是数字,且现有几个这样的字符串,怎样组合可以得到最大(最小道理也是一样的)的数字? 大致思路:任意两个字符串组合,有两种组合方式。分别是AB和BA。比较这两种组合方式谁比较大 格式: bool cmp(string& a,string& b) { return a + b > b + a; } 注:我在没接触过这道题的时候 第一个思路是:比较两个字符串,谁大就把谁放到前面。这个思路是错误的。 321 32 这样按照这个思路组合出来的数是32132原创 2021-12-14 12:36:41 · 514 阅读 · 0 评论 -
洛谷p1249最大阶乘
题目链接:最大阶乘 重点知识点: 贪心,高精度乘低精度。 贪心部分: 本道题的贪心思路是: 一个数被拆分成越多数,它们的乘积越大。因此从2开始一直枚举,直到2+3+4+…+n大于等于n的时候才停下。 (注:为什么不从1开始,因为乘1不会使乘积变大,且会浪费一个数的大小) 1.如果枚举的数的累加和比n大1,那么就删去第一个数2,且让最后一个数++。(这样可以让乘积最大) 2.如果枚举的数的累加和比n大2及以上,则找到它们之间的差值,并删去枚举的那个数字。(因此可以看出我们是要记录枚举的所有数字的) 这种贪心写原创 2021-12-10 22:52:22 · 648 阅读 · 0 评论 -
洛谷P1328生活大爆炸版石头剪刀布
题目链接:生活大爆炸版石头剪刀布 重点知识:二维数组算得分 若题目中有一堆条件让你去判断谁得分,可以采用二维数组算得分的方式。 比如:0代表石头,1代表剪刀,则若A出0,B出1,A得分为1,B得分为0。用数组表示成 int score[][2] = {{1,0},{0,1}}; 下标代表人物出的手势,值代表得分(具体是谁的得分由你制定规则) score(0,1)代表A出了拳头,B出了剪刀。A得分为1 score(1,0)代表A出了剪刀,B出了石头,A得分为0. (当然反过来也行) AC代码 #includ原创 2021-12-09 00:13:02 · 171 阅读 · 0 评论 -
洛谷P4924魔法少女小Scarlet
题目链接:魔法少女小Scarlet 重点知识点: 1.矩阵旋转公式: 从上面的数学公式可以推出来 顺时针旋转:(i,j) --> (j,-i) 逆时针旋转: (i,j) --> (-j,i) 由于数组下标没有负数,统一对它们加上一个x和y得到 矩阵旋转需要备份数组 顺时针 backup[x+j][y-i] = a[x+i][y+j] 逆时针 backup[x-j][y+i] = a[x+i][y+j] 对n*n的矩阵进行旋转,通用模板: for(int i = -r; i <= r;原创 2021-12-09 00:05:22 · 889 阅读 · 1 评论 -
洛谷P1563玩具谜题
题目链接:玩具谜题 重点知识点: 1. 一个长度为n的数组,现在我的下标是k,请问我向左移动m个单位后我的下标是多少?(数组可以循环,下标0往左移动一位之后下标就变成n-1) 公式: (k + n - m) % n; 一个长度为n的数组,现在我的下标是k,请问我向右移动m个单位后我的下标是多少? 公式: (k + m) % n; AC代码 #include <iostream> #include <algorithm> #include <cstring> us原创 2021-12-08 23:51:27 · 264 阅读 · 0 评论