随笔分类 - 数据结构与算法
摘要:首先我们来求第m次移动的盘子号数,先列出当m比较小可以直接观察的前几项 m : 1、2、3、4、5、6、7、8、9、10 id : 1、2、1、3、1、2、1、4、1、2 很容易联想到树状数组的lowbit,这题的id就是lowbit(m)在二进制中的编号。 for (id = 1; (m & 1)
阅读全文
摘要:可以用贪心求最小讲课次数,贪心策略也很好想,就是对于任意主题,能早讲就早讲。这种方案的讲课次数一定是最少的,但是不满意指标不一定是最小,然后再利用动态规划求在最少讲课次数前提下的最小不满意指标。 方法一(自己想到的) Accepted 1183 C++11 1020 4240 #include "b
阅读全文
摘要:时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 杂货店出售一种由N(3<=N<=12)种不同颜色的颜料,每种一瓶(50ML),组成的颜料套装。 你现在需要使用这N种颜料;不但如此,你还需要一定数量的灰色颜料。 杂货店从来不出售灰色颜料——也就是它不属于这N种之一。幸运的是
阅读全文
摘要:贪心策略: 要么让最快的人依次把最慢的两个人渡过河再回来。要么让最快的两个人先过河,最快的人回来,然后最慢的两个过河,第二快的回来。直到剩余人数少于4人为止; 1700 Accepted 320K 16MS G++ 668B #include "cstdio" #include "algorithm
阅读全文
摘要:dp[i][j]表示i个砖头构成的最高台阶不高于j的楼梯数目 Accepted 1163 C++11 0 2280 #include "bits/stdc++.h" using namespace std; typedef long long LL; const int MAXN = 500 + 5
阅读全文
摘要:就是分别以1到9作为开头构造结果,取最小答案。看了参考书之后才做出来,对参考书上的代码进行了一些改进 Accepted 1177 C++11 0 408 #include "bits/stdc++.h" using namespace std; // 参考书上说经在线测试ans的位数最高在15000
阅读全文
摘要:设 ans 为满足前 n - 1个同余方程的解,lcm是前n - 1个同余方程模的最小公倍数,求前n个同余方程组的解的过程如下: ①设lcm * x + ans为前n个同余方程组的解,lcm * x + ans一定能满足前n - 1个同余方程; ②第 n 个同余方程可以转化为a[n] * y + b
阅读全文
摘要:这题要求两个串中的最长相同子串的长度。高度数组可以求一个串中的最长相同子串的长度。所以想到把两个串连起来,但是这样又会产生一些新的串(第一个串的结尾和第二个串的开头组成的)于是在两个串中间放一个'\0'分隔,正好'\0'是字符里最小的,不会对第一个串的排序产生影响。 Accepted 1403 62
阅读全文
摘要:看了求后缀数组的倍增法之后很快就理解了,但是自己写的倍增法用map排序还是超时了。然后看了两天别人写的模板,题目是通过了,但感觉代码还是半懂半背的。以后多熟悉熟悉吧; 后缀数组 #include "bits/stdc++.h" using namespace std; const int MAXN
阅读全文
摘要:Rabin-Karp Accepted 1711 904MS 5272K 1310 B G++ #include "bits/stdc++.h" using namespace std; typedef long long LL; const int MAXN = 1e6 + 5; const in
阅读全文
摘要:上来先一顿暴力,结果70分就超时了。 然后意识到稀疏矩阵,有很多0,如果c[i][j] != 0,那么一定存在至少一个k满足a[i][k] != 0 && b[k][j] != 0; 然后就一发水A啦 1675 稀疏矩阵乘积 AC G++ 35ms 15MB #include "bits/stdc+
阅读全文
摘要:时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串类型的数组strs,请找到一种拼接顺序,使得将所有的字符串拼接起来组成的大字符串是所有可能性中字典顺序最大的,并输出这个大字符串。 输入 第一行:N(1<N<=100),代表数组的长度第二行:N个字符串,作为数
阅读全文
摘要:计数排序 Accepted 1425 483MS 5276K 997 B G++ #include "bits/stdc++.h" using namespace std; typedef long long LL; typedef pair<int, int> PII; const int INF
阅读全文
摘要:给定你个数组,以及一些单点修改,以及询问,每次询问需要求得,最长的字串长度,它在其他位置存在同构。 当存在两个不相交的区间同构时,如: 1、2、……、n -1、n、n + 1、……、m、m + 1、m + 2、 ……、m + n - 1、m + n;(假设m > n&&[1, n]和[m + 1,
阅读全文
摘要:做题中常用的位运算有以下几种: 判断奇偶性 if (n & 1) { printf("偶数"); } else { printf("奇数"); } 常用于快速幂和其他判断奇偶性的地方 乘除2的整次幂 scanf("%d%d", &n, &m); // 输出n乘2的m次方 printf("%d", n
阅读全文
摘要:希尔排序 Accepted 1040 0MS 1224K 564 B G++ #include "cstdio" using namespace std; int arr[5000]; int main() { int t, n; scanf("%d", &t); while (t--) { sca
阅读全文
摘要:太久没写最小生成树了,快忘光了。这几天回顾了一下 最小生成树一·Prim算法 AC G++ 369ms 17MB #include "cstdio" using namespace std; const int INF = 0x3f3f3f3f; int road[1005][1005]; int
阅读全文
摘要:欧拉回路的条件是所有节点的度数为偶数并且是联通图,但是照这题的描述所说并不需要所有点都联通,如果某个点的度为0,被孤立,依旧可能存在欧拉回路; 所以用set来存度不为0的节点,用并查集判联通就好了 #include "bits/stdc++.h" using namespace std; int d
阅读全文
摘要:拓扑排序 #include "bits/stdc++.h" using namespace std; // 用来存某个点的入度数量 int num[505]; // 用来存某个节点的出度 set<int> outde[505]; int ans[505]; priority_queue<int, v
阅读全文
摘要:比较可惜昨天比赛的时候时间不够了,在比赛结束之后五分钟找出了bug提交通过了。然并软; 首先这题说b数组的后一项要么等于前一项,要么等于前一项加一,而且如果a[i] == a[j] ,那么b[i] == b[j],所以如果a[i] == a[j],b[i]到b[j]这个区间的值都是一样的,可以看做一
阅读全文