随笔分类 - 编程
摘要:今天俺在虐简单题目的路上被一道一级的看似简单实则DP的题目搞崩了 先来找动态转移方程: 过程十分复杂直接上结论: 俺不会! F(N)=F(N-5)+F(N-2)-F(N-2-5)+1; 最后一个for解决战斗 要注意的是,我们可以通过将输入的N除以十以及将10、20、50除以十来进行优化。 程序:
阅读全文
摘要:这道题目要用二分+桶排的方式解决 函数: l~r找v c:靠左/右(‘l’/‘r’) 靠左和靠右用STL函数二分就行,这里讲一下思路,二分出最靠左/右的v值(but二维,在but[v][0~len]区间二分)再判断是否在区间内在区间内输出but[v][a](a为二分的答案)否则输出-1。 靠左:用l
阅读全文
摘要:这道题目可以用递归来解(不是正解) 思路如下: 1.输入 2.递归 2.1判断是否合法 return 2.2判断是否只有一个数 输出,return 2.3根节点是前序遍历的首节点,再在中序遍历中找到根节点的位置,找到位置之后就可以把中序遍历和前序遍历分成左子树和右子树 2.4进入下一层(分治,一个是
阅读全文
摘要:题目: 这道题目就是差分加二分答案。 先看为什么能差分,因为题目中的从s[j]借到t[j]就相当于对一个区间进行操作;再看为什么能二分,废话有单调性啊因为可以借n个教室那也可以借n个以下的教室,相反如果不能借n个教室也就不能借n个以上的教室。 再来讲程序,先将n,m.....(一大堆读进来) 再来说
阅读全文
摘要:题目: 使用优先队列。开优先队列:priority_queue<int,vector<int>,greater<int>> que;1.输入输入 n(<=10000),m(<=100)(m<=n)将输入的打水时间存入a数组中。2.处理数据2.1遍历a[i]数组,i<=m时,将a[i]推入que中。
阅读全文
摘要:0.题目 1.输入 输入 n,q; 输入图书,存入vector string a[20]数组,a[i][j],其中i表示图书编号的位数 2.查询操作 2.1 每输入一个读者需求 存入 int t; string s1; 2.2 遍历一遍a数组 2.2.1 遍历a[i][j],i属于[t,9],j属于
阅读全文
摘要:题目:(由于题干过长直接上链接:P7910 [CSP-J 2021] 插入排序 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)) 不是打广告 又有一个新思路: 我们可以再开一个b数组用来记录第i个数排序后的位置并在更改数据(操作一)后维护b数组,使b数组依然适用。 同时还要开一个s
阅读全文
摘要:这道题目是一道Dijkstra的题目。 我们先来回顾一下加边函数 void add(int u,int v,int w) { edge[k].to=v; edge[k].w=w; edge[k].next=head[u]; head[u]=k++; } 这道题目可以用优先队列也可以用手写队列(我要用
阅读全文
摘要:这道题目要用到Floyd算法。(也就是那个n³复杂度的东东) 小细节: 1.x==y的f数组要一并设为true 小知识: |(一个|)是运算符只要在参与判断的二个bool之内有一个是一()也就是true就返回true。 &(一个&)是运算符在参与判断的两个bool内必须二个都是true才返回true
阅读全文
摘要:这道题目又要用到新的算法:并查集 其实就是一个向上的递归过程,但我们只关心x点的祖先是谁,这里就可以用到路径压缩(让x直接指向祖先) 👇 int find(int x) { if(fa[x]!=x) { fa[x]=find(fa[x]); } return fa[x]; } 并查集已经弄好了查就
阅读全文
摘要:这道题目需要用到 Dijkstra plus 版(堆优化) 模板还是一样就是有几个点值得注意 1.这里用的是优先队列,原版需要搜出最小,并且没用过的点,省时间就剩在这里用小根堆就可以完美解决这个问题。 2.模拟链表(我认为有亿 一点难度)需要h,e,w,ne来模拟。 3.还有一个add(a,b,c)
阅读全文
摘要:这道题目又是一个新算法,名叫Dijkstra 主要思路是:输入+dist和vis初始化(都初始化为0x3f)+输入g(邻接矩阵)+Dijkstra函数 Dijkstra函数:先将dist[1]设为1(起点到起点当然0代价),然后将每个点都更新一遍。在循环里面我们先找出最小但没更行新的点然后用这个点更
阅读全文
摘要:这道题目涉及到一个新算法:Floyd 这里不放洋屁了,大体就是 DP! 就是一个固定格式的dp 它的核心代码非常简单(也非常像dp) for(int k=1;k<=V;k++) { for(int i=1;i<=V;i++) { for(int j=1;j<=V;j++) { if(dis[i][j
阅读全文
摘要:一 原始数据处理 1.输入数据得到a[1]~a[n],复制扩展a[n+1]~a[2*n],以便处理不同点为起点出发。 cin>>n>>m; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); a[i+n]=a[i]; } 2.计算前缀和 sum[1]=a[1]; f
阅读全文
摘要:一道又臭又长的模拟题目。。。。。 主要有几个小技巧可以帮大家省一省代码: 1.scanf("%d.%d",&b,&c); 这里是定了一个格式如果不按格式来就不输入后面的内容 程序中用来分离数字方便计算 2.sscanf(a,"%d.%d",&a,&b); 这是从a字符串中读入a和b他反回的是读入了几
阅读全文
摘要:我有新思路了,链接:https://www.cnblogs.com/wjk53233/p/16533752.html 我有新思路了,链接:https://www.cnblogs.com/wjk53233/p/16533752.html 我有新思路了,链接:https://www.cnblogs.co
阅读全文
摘要:高精度加 1 // C = A + B, A >= 0, B >= 0 2 vector<int> add(vector<int> &A, vector<int> &B) 3 { 4 if (A.size() < B.size()) return add(B, A); 5 6 vector<int>
阅读全文
摘要:这道题目的思路就是二分主要说一下二分的check函数 check函数思路: 1.把a数组遍历一遍将所有的数除以已给的t商都加给num 2.把num与m作比较num>=m return 1; else return 0; 1 unsigned long long check(unsigned long
阅读全文
摘要:这道题目的主要思路: 1.开struct (一)因为题目要求老师让跳的低的小朋友先摘而且最后还要按着题目给的顺序输出(前面的那个要求需要用sort但后面需要按原顺序输出但不能sort回去)十分坑爹所以要用strcut (二)这里如果用一个数组 来纪录 这个数是第几个小盆友,就会因为要用a来做下标 得
阅读全文
摘要:这道题目还是难在check函数。 check思路:遍历数组,如果目前两点距离小于k(带进去的数)就搬走(cnt也就是需要搬几块石头++)否则更新目前位置📍。 1 int check(int k) 2 { 3 int s=0,cnt=0; 4 for(int i=1;i<=m;i++) 5 { 6
阅读全文

浙公网安备 33010602011771号