![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
牛客
牛客训练补题
不会喷火的绿色小恐龙
这个作者很懒,什么都没留下…
展开
-
2021-11-09
题目二分是没有想到的,两个人耗时最短也需要分情况讨论,也是不能确定的。而函数cal()就是判断某种情况下两个人的朝着哪个方向走的问题。#include <bits/stdc++.h>using namespace std;#define T int T; scanf("%d", &T); while(T--)inline double cal(double x, double p, double v){ return (min(p, x-p) + x) / v;}原创 2021-11-09 19:11:20 · 58 阅读 · 0 评论 -
2021-11-08
题目终究是题目没有读清,而且父目录和子目录之间的关系,联系树,一定要清楚什么是父亲,什么是祖先,什么是儿子。这道题目就是模拟题,太悲伤了。#include <bits/stdc++.h>using namespace std;#define T int T; scanf("%d", &T); while(T--)int n, m;vector<string> v;set<string> part, vis;int main(){ T{原创 2021-11-08 17:35:58 · 61 阅读 · 0 评论 -
2021-11-07
l题目训练的时候不认真,看到题解的时候才发现,题目理解错了,所以当做出来题目的时候还是要多读题。当时思考的时候,也想过取反操作。看了题解不懂,吃饭的时候想出了思路,当时还有点质疑,晚上补题的时候,补过去了。当然代码写得太傻了。01图,所有位置取反之后数字总和不变#include <bits/stdc++.h>using namespace std;const int N=1e3+10;char a[N][N], a1[N][N], b[N][N];int main(){原创 2021-11-07 15:47:39 · 54 阅读 · 0 评论 -
2021-08-20
题目.先提前声明,本篇博客的代码过题会T,但是思路没问题,就是暴力打表。说实话,对于这样的博弈题,打表实在是从未想过的做法。其实,从最初的状态的进行按照题意的操作,现在的状态建立以前已知的转态,就可以判断出现在的状态下,两人的输赢情况。#include <bits/stdc++.h>using namespace std;const int N=5e3+10;#define T int T; scanf("%d", &T); while(T--)int a[N][N];原创 2021-08-20 21:26:58 · 44 阅读 · 0 评论 -
2021-08-20
题目利用本题回顾有关最短路径的相关知识。本菜鸡觉得自己不是不能理解最短路径的想法,但是码力太弱了,所以对于这样的知识点很容易忘记。继续努力!!!#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll INF=0x3f3f3f3f3f3f3f3f;const int N=2e5+10;const int M=4e5+10;int d[8][N];int head[N], nex[M], v原创 2021-08-20 20:01:38 · 43 阅读 · 0 评论 -
2021-08-20
题目是本菜鸡想的太难了,看了别人的代码,其实直接暴力就能过。不过也没想到这样做,最开始一直想用string存取数字,这样的话就有些麻烦了,而且还老T。但是有一点不清楚的是为什么一定要对10007取模,同样是质数10009为什么就不能通过?希望菜鸡接下来的学习过程能破解这个问题。现在先留着。#include <bits/stdc++.h>using namespace std;const int N=1e4+10;const int mod=10007;int dat[N], judg原创 2021-08-20 13:54:55 · 38 阅读 · 0 评论 -
2021-08-19
题目对于这道题目,一定会尽量选取路程花费时间的小的人来当司机。但是每辆车往返几次是无法确定的,选择几辆车也是无法具体确定的。比赛的时候一直不会,以为是背包,或是利用优先队列来做。赛后看别人的代码,才发现原来可以用二分过。可惜本菜鸡的思路太过狭窄。#include <bits/stdc++.h>using namespace std;#define T int T; scanf("T", &T); while(T--)typedef long long ll;const int原创 2021-08-19 21:11:30 · 48 阅读 · 0 评论 -
2021-08-19
题目题目要求:给定一个出入栈序列,要求寻找一个对应,使得任何一个时刻insert后,序列内的形态不同。一个出入栈序列可以转化成一棵树(本菜鸡在这道题目学到的知识点,隐约记得PTA甲级上也有类似的题目,不过很简单,当时一下就过了),然后条件就是从根到每一个节点的链所构成的颜色序列两两不同。即每个点的儿子结点颜色各个不同,也就是树的每层上的结点颜色都不相同;要是相同了,就NO了。本菜鸡还学到了关于C++中容器vector的更多知识。这道题目蛮有意思的,值得多去想一想。#include <bits/原创 2021-08-19 19:36:11 · 46 阅读 · 0 评论 -
2021-08-18
题目怎么说呢,就是没有理解题意。通过这道题目,可以知道二进制下某个整数的1的个数。满足题意的相邻两个数在二进制下1的个数的差值为1(二进制下只有一位不同)。即就是二进制下1的个数为奇数和偶数相连。最多连在一起的即为2n2^{n}2n这样的数字。假设最多有xxx个这样的数字,即为2x+1≤(n+1)2^{x+1}\le(n+1)2x+1≤(n+1),即x≤log2(n+1)−1x\le log_{2}(n+1)-1x≤log2(n+1)−1。这种情况下,x≤⌈n⌉x\le\lceil \sqrt n原创 2021-08-18 19:11:13 · 45 阅读 · 0 评论 -
2021-08-15
题目第k个意思就是3进制下n位中的第b个与前n-1位的组合数的总和。所以需要最先确定总共有几位,求出n-1位的组合总数,再求剩余数字对应的三进制,利用2对应0,3对应1,6对应2的规则进制转换。其实相当于把k转化为3进制,在除首位的其他位数各减1,注意顺序是从低位到高位。相当于,对应规则发生了改变,2对应1,3对应2,6对应0。代码实现的话,可以n可以边除以3,边对3取模得到的余数,就是对应位数的三进制各位上的数(顺序是从低位到高位),但是注意当模数为0时,说明它向相邻的高位借1,已经除以3之后再减原创 2021-08-15 15:01:32 · 52 阅读 · 0 评论 -
2021-08-14
题目是一道水题,之所以特意写出来,是因为觉得取模(也就是模数的性质)真得值得注意。最开始交的一发,是缺少在for循环里取模。不经让菜鸡想起遥远的杭电新生赛,那是第一次接触到反复取模的题目,写了两个多小时,靠自己推数学公式推出来的模数的一点性质。有空做一个关于取模的题型和知识小结。用这道题目提醒自己。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define T int T; scanf("%d", &原创 2021-08-14 15:26:14 · 39 阅读 · 0 评论 -
2021-08-13
题目当k>=2k>=2k>=2时,最长路径为整棵树的边权和;当k<2k<2k<2时,最长路径为树的直径,用两次dfs(bfs)或者树形DP求解;顺便学习如何求树的直径。#include <bits/stdc++.h>using namespace std;const int N=2e5+10;typedef long long ll;int n, k, p, t;int father[N], child[2*N], link[2*N], we原创 2021-08-13 16:07:57 · 42 阅读 · 0 评论 -
2021-08-13
题目不论比赛的时候,还是赛后补题的时候,一直以为满足题意的字符串的长度一定要相等,所以看样例的时候,一直百思不得其解。看了官方的题解思路之后,才发现自己先入为主地读错题意了。值得警醒自己,一定要认真读题,分析题意。至于解题思路,是本菜鸡自己想的,注意满足题意的字符串的左右两端是不能再删去字符,而且该字符串覆盖了整个字符串的所有不同字符。在这种情况下,要求字符串长度最小。#include <bits/stdc++.h>using namespace std;typedef long lo原创 2021-08-13 12:26:32 · 54 阅读 · 0 评论 -
2021-08-12
题目.暴风哭泣,这道题目不考什么知识点,就是考C语言的基本功啊。大二(即将大三)老菜鸡陷入自闭中。比赛的时候,还一直用string字符串进行分析,结果连WA9发,依旧没过。#include <bits/stdc++.h>using namespace std;typedef long long ll;int main(){ double r, s; while(scanf("%lf %lf", &r, &s)!=EOF){ pri原创 2021-08-12 18:59:04 · 40 阅读 · 0 评论 -
2021-08-12
题目一道模拟题。比赛的时候不明白题意。赛后看了很久才明白题意。本来是对p1p_{1}p1,q1q_{1}q1,p2p_{2}p2,q2q_{2}q2进行处理,得到∣p1−x∣|p_{1}-x|∣p1−x∣, ∣q1−x∣|q_{1}-x|∣q1−x∣,∣p2−x∣|p_{2}-x|∣p2−x∣,∣q2−x∣|q_{2}-x|∣q2−x∣这四个数字,再分类讨论。但是脑子糊,实在讨论不出来,尤其当∣p1−x∣=∣q1−x∣|p_{1}-x|=|q_{1}-x|∣p1−x∣=∣q1−x∣时原创 2021-08-12 14:17:44 · 51 阅读 · 0 评论 -
2021-08-11
题目虽然比赛的时候没做出来,其实对这道题目还是蛮感兴趣的。首先,要明白二进制中+++与∣|∣之间的关系(就题目给出的条件来看);也就是c[i] = b[i] + d[i] = a[i-1] | a[i] + a[i-1] & a[i] 这样的关系;因为a[i-1]&a[i]和a[i-1]|a[i]的结果均已知,所以可以反推回a[i]和a[i-1]的结果;所以对a[i]的每一位进行枚举。#include <bits/stdc++.h>using namespace s原创 2021-08-11 20:41:55 · 47 阅读 · 0 评论 -
2021-08-11
题目只要数学,贪心,几何和枚举学得好,这题就很简单。但是本菜鸡不行啊。解决的方法是,先得到所有两点间的距离,接着排序,选取最短距离的两个点作为起点。设已经停止增长的点集合为V1V_{1}V1,正在增长的点集合为V2V_{2}V2对于一个点aaa,计算与集合V1V_{1}V1所形成的圆的最短距离,以V1V_{1}V1中的某个点bbb为例,两个点的距离为dab=(xa−xb)2+(ya−yb)2d_{ab}=\sqrt{(x_{a}-x_{b})^{2}+(y_{a}-y_{b})^{2}}da原创 2021-08-11 14:43:06 · 49 阅读 · 0 评论 -
2021-08-10
题目本题是几何、数学和枚举的结合。最坏情况:当w>=πw>=\piw>=π 且 d>=πd>=\pid>=π时,此时最多只能以四个矩形的交点为起点,绕一周,覆盖四个矩形;可以考虑到两种情况:斜线:可以越过三个形成角落的矩形,此时dis=a2+b2dis=\sqrt{a^{2}+b^{2}}dis=a2+b2;直线:可以越过两个相邻的角落,此时len=min(w,d)len=min(w, d)len=min(w,d);这两种情况最多出现两次。本菜鸡进行分析,对原创 2021-08-10 20:14:57 · 42 阅读 · 0 评论 -
2021-08-09
题目看了题解以后,才发现提议理解错了。而且通过这道题目,明白了一个新的知识点。以前看别人的题解,一直不懂。在C/C++中, +, -的优先级低于/, ∗*∗, %。而 /, ∗*∗, %优先级一样,所以从左到右进行运算。加法或减法(a±b)%c=((a%c)+(b%c))%c(a\pm b)\%c = ((a\%c)+(b\%c))\%c(a±b)%c=((a%c)+(b%c))%c乘法(a∗b)%c=(a%c)∗(b%c)%c(a*b)\%c=(a\%c)*(b\%c)\%c(a∗b)%c原创 2021-08-09 20:10:53 · 50 阅读 · 0 评论 -
ST学习小结
ST学习小结算法介绍练习(~~补题~~)拓展算法介绍RMQ问题给定数组A[0, N-1],找出给定的两个索引i和j间的最小值的位置。ST(Sqarse Table)算法是利用倍增的思想来解决RMQ问题的算法之一,适用于查询次数很大。可用于得到区间的最小值和最大值。用二维数组M[i][j]表示从下标i开始,长度为2j2^{j}2j的子数组的最小值的索引。算法复杂度: 初始化O(nlogn)O(nlogn)O(nlogn) 和查询 O(n)O(n)O(n)代码如下:#include <原创 2021-08-09 15:27:09 · 122 阅读 · 0 评论 -
2021-08-06
题目说实话,赛后补题的时候,想到这样的方法,但是觉得太麻烦了,所以没写。但是看到题解代码,果然想出来和写出来是不一样的境界。还是组合的问题。#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod=998244353;const int N=1e5+10;char a[N], b[N];ll dp[N], sum[N];//72345600=(1~1e7)(sum[8-1]前7位原创 2021-08-06 18:58:37 · 44 阅读 · 0 评论 -
2021-08-06
题目最开始思考,也有想过栈stack。灵感是来源于暑假牛客多校的训练赛的一道题。那道题目里,stack里某段数字具有一定的单调性,其次再利用拓扑排序。这道题也是这样,区间的两个端点均大于两个端点内的数据。虽然大致思路,与题解类似。但是本菜鸡始终都缺少if-else的思维方式,当while循环终止时,对于不满足while循环的条件或者仅满足一部分时,又该如何处理。觉得类似的题目都可以用栈stack数据结构去尝试一下。#include <bits/stdc++.h>using namespa原创 2021-08-06 16:07:29 · 44 阅读 · 0 评论 -
2021-08-06
题目只能说比赛的时候想的太复杂了,导致没有做出来。实际上就是纯暴力,得到所有的答案集合。之后再一一比较,哪种答案下,最低分最高。还以为是类似于一张扑克牌,要么选正面,或者反面;收集了k张扑克牌,问如何使最小值最大。当时以为是背包,想了许久。因为n的范围,所以采用dfs#include <bits/stdc++.h>using namespace std;const int N=1010;int n, k, ans;string str[N], temp;void dfs(int原创 2021-08-06 12:42:07 · 29 阅读 · 0 评论 -
2021-08-04
题目这道题最开始没有思路,但是分析了一下,两个人最终各自移动硬币数之和,必为全部硬币数的一半res。且栈里最大的硬币数一定小于或等于res。但是接下来思路就偏了,以为要得到划分到一起的栈的下标。实际上并不用,因为两个人是一轮中一个一个拿走的,所以让两个栈中的硬币数各自减一,为0即止。所以轮数必为res。这样不断的循环,就能表示每轮的情况。#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pa原创 2021-08-04 16:41:52 · 39 阅读 · 0 评论 -
2021-08-04
题目比赛的时候读懂了题目,但是不会,硬写会T。果然赛后自己写的就T了,还用了树状数组和快速幂,十分暴力。然后看了大佬的代码,觉得精妙无比。原理是这样,条件是按照输入的顺序,必须有一个1,至少有1个2,必须有1个3。对于每一个1,它后面的2都有选与不选两种可能,且相互独立。但是我们还需要记录1的个数,或者说是都不选的情况的个数。所以对于每一个3,就用当前的情况数减去1的个数。#include <bits/stdc++.h>using namespace std;#define T int原创 2021-08-04 14:00:36 · 45 阅读 · 0 评论 -
2021-08-03
题目可惜了,比赛的时候把题目想得太复杂了。该考虑的情况也都考虑到了,可惜就是拘泥于一些结果上,导致差一点就过题目了。之前打cf,也是这样。构造的思路不清晰明了。不过通过这道题,忽然发现自己的if-else的结构应用得不好, 整体的遍历也把握不好。#include <bits/stdc++.h>using namespace std;#define T int T; scanf("%d", &T); while(T--)typedef long long ll;const in原创 2021-08-03 20:16:38 · 36 阅读 · 0 评论 -
2021-08-03
题目看到这样的题目第一印象是感觉很难,想起背包什么之类的。所以比赛的时候就放弃了。直到看到题解,才发现原来就是贪心。由此看来,确实缺乏深入分析问题的勇气。设每个锅最小消耗时间是T=max{max{ti},⌈∑i=1ntim⌉}T=max\lbrace max \lbrace t_{i} \rbrace, \lceil\frac{\sum_{i=1}^{n} t_{i}}{m}\rceil \rbraceT=max{max{ti},⌈m∑i=1nti⌉}#include <bits/原创 2021-08-03 19:22:10 · 37 阅读 · 0 评论 -
2021-08-03
题目仅以此题纪念爆零的一场。怎么说呢,题目一直读错了,快到结束的时候才正确理解题目的含义,并明白了样例如何得到的。也看出来规律,又或者说没有完全明白规律。所以最终爆零。知识点的话,大概就是取模的意义吧#include <bits/stdc++.h>using namespace std;#define T int T; scanf("%d", &T); while(T--)typedef long long ll;typedef pair<int, int> P原创 2021-08-03 16:04:16 · 37 阅读 · 0 评论 -
二分的性质
题目通过这道题,本菜鸡对“二分”有了进一步的认识。这位大佬的文章分析真的很好文章对于二分,二分是二分性而不是单调性。只要满足可以找到一个值一半满足一半不满足即可,而不用满足单调性#include <bits/stdc++.h>using namespace std;const int N=1e5+10;int a[N], b[N];double sum[N];int n, m, x, y;bool check(double avg, int x, int n, int原创 2021-07-29 19:39:46 · 417 阅读 · 0 评论 -
第十八届同济大学程序设计竞赛暨高校网络友谊赛
题目当本菜鸡补题的时候,发现比赛的时候题意又又又又读错了,一直被题目中的满二叉树和完全二叉树所困扰,一直推不出来样例的答案是怎么来的。其实这些站点就是满二叉树的叶子结点,明确这一点之后,用一次dfs就可以得到答案了,注意遍历的结点的条件。#include <iostream>const int maxn=1e5+10;int m, n, k, a, b[maxn], step=0, num=0;void dfs(int root){ step+=1; if(b[roo原创 2021-05-27 18:35:23 · 73 阅读 · 0 评论