
acwing
幽殇默
他时若遂凌云志,敢笑黄巢不丈夫。
展开
-
900. 整数划分
方法一: 完全背包解法状态表示:f[i][j]表示只从1~i中选,且总和等于j的方案数对于第i个元素可以选,也可以不选,如果不选i 即 f[i-1][j] 如果选了i,总和才为j 故剩余的总和为j-i 即 f[i][j-i]状态转移方程: f[i][j] = f[i - 1][j] + f[i][j - i]#include<bits/stdc++.h>using namespace std;const int N=1e3+10;const int mod=1e9+7;i.原创 2021-09-06 16:41:24 · 115 阅读 · 0 评论 -
899. 编辑距离
https://www.acwing.com/problem/content/901/#include<bits/stdc++.h>using namespace std;const int N=15,M=1e3+10;int f[M][N],n,m;char str[M][N];int dist(char a[],char b[]){ int la=strlen(a+1),lb=strlen(b+1); for(int i=0;i<=lb;i++.原创 2021-09-06 15:41:52 · 137 阅读 · 0 评论 -
902. 最短编辑距离
https://www.acwing.com/problem/content/description/904/因为我们是一步一步的递推的所以,最后的插入、删除、修改操作只需考虑最后一个即可。摘自: https://www.acwing.com/solution/content/10499/#include<bits/stdc++.h>using namespace std;const int N=1e3+20;int f[N][N],n,m;char a[N],b[N];i.原创 2021-09-06 14:44:22 · 74 阅读 · 0 评论 -
896. 最长上升子序列 II
f[i] 表示长度为i的最后一个数字最小的数字,因为相同的长度最后一个数字越小,越有扩展的可能。#include<bits/stdc++.h>using namespace std;const int N=1e5+10;int f[N],a[N],n;int main(void){ cin>>n; for(int i=0;i<n;i++) cin>>a[i]; int len=0; for(int i=0;i<n;.原创 2021-09-06 14:03:06 · 139 阅读 · 0 评论 -
1214. 波动数列
https://www.acwing.com/solution/content/9223/https://www.acwing.com/solution/content/7507/目标状态:合法转移到s,共有n−1步,故最终答案为f[n−1][s%n]#include<bits/stdc++.h>using namespace std;const int N=1010,mod=1e8+7;int n,s,a,b,f[N][N];int get_mod(int a,int ...原创 2021-08-17 18:21:57 · 177 阅读 · 0 评论 -
1212. 地宫取宝 【四维DP】
https://www.acwing.com/problem/content/1214/#include<bits/stdc++.h>using namespace std;const int N=55,mod=1e9+7;int n,m,k;int w[N][N];int f[N][N][13][14];int main(void){ cin>>n>>m>>k; for(int i=1;i<=n;i++) for(int j.原创 2021-08-17 17:30:33 · 106 阅读 · 0 评论 -
1224. 交换瓶子【思维 / 图论】
https://www.acwing.com/problem/content/description/1226/暴力做法:#include<iostream>using namespace std;const int N=10010;int s[N];int n,cnt;int main(){ cin>>n; for(int i=1;i<=n;i++) scanf("%d",&s[i]); for(int i=1;i<=原创 2021-08-16 20:43:56 · 237 阅读 · 0 评论 -
1238. 日志统计 【双指针】
1238. 日志统计 【双指针】https://www.acwing.com/problem/content/1240/#include<cstdio>#include<iostream>#include<map>#include<algorithm>using namespace std;typedef pair<int,int> PII;#define x first//时间#define y second//idcon原创 2021-08-16 18:24:40 · 137 阅读 · 0 评论 -
796. 子矩阵的和
796. 子矩阵的和本题的关键在于如何的求矩阵的前缀和。其前缀和都是从当前点的右下角到左上角。那么首先的第一个问题就是如何计算其矩阵的前缀和。例如: 你要求(1,1) 到 (2,3)的前缀和。它就等于红色的矩阵加上橙色的矩阵减去重复的部分再加上单独的那一块。假设前缀和数组为 sum[ i ][ j ]。那么 sum[ 2 ] [ 3 ] =sum [ 2 ] [ 2 ] + sum [ 1 ,3 ] - sum[ 1, 2 ] +a[2] [3 ]。总结为公式就是: s原创 2021-08-16 10:12:54 · 409 阅读 · 0 评论 -
数的范围 【二分】
整数二分 【例题 数的范围】整数二分最难的在于边界的选定,选定的不好就可能陷入死循环。根据y神所讲。解决整数二分用两个模板即可解决几乎所有的二分问题。整数二分步骤:找一个区间 [ L , R ] ,使得答案一定在该区间中。找一个判断条件,使得该判断条件具有二段性,并且答案一定是该二段性的分界点。分析最终点M在该判断条件下是否成立,考虑答案在哪个区间;如果不成立,考虑答案在哪个区间。如果更新方式写的是R=mid,则不做任何的处理,如果更新方式写的是L=mid,则需要在计算mid时加上1。‘原创 2021-08-15 19:41:38 · 147 阅读 · 0 评论 -
1209. 带分数
大致的思路:第一种: 比较暴力的思路就是弄出全排列。然后再依次的枚举出 a,b,c。最后判断符不符合条件。第二种就是 既然已经知道n了。那么把c乘过来。这样的话直接枚举 a和c 剩下的b可以直接求得。最后再检查一下b满足不满足条件。#include<cstdio>#include<cstring>#include<iostream>using namespace std;int n;int ans=0;bool st[20],backup[2.原创 2021-08-15 19:33:06 · 112 阅读 · 0 评论 -
116. 飞行员兄弟
116. 飞行员兄弟题目的意思就是:你动一个它是一个大的十字的变化。解题思路:枚举出所有的情况,即216种情况。我们用0代表不操作,1代表操作。啥意思呢?例 : 0000 0000 0000 0001 就代表的是只操作第一个开关例 : 0000 0000 0001 0001 就代表的是操作第一个开关和第五个开关对每一种情况我们遍历每一次的操作,最后看灯是不是全亮。注意操作的时候我们要把二维的数组下标变成一维的数组。这样才可以看各个位是不是1,决定要不要操作。原创 2021-08-15 16:50:32 · 139 阅读 · 0 评论 -
1208. 翻硬币 【递推】
1208. 翻硬币 【递推】思路:你可以想象有9个开关来控制着这些硬币。假如第一个和目标的第一个不相同。那么第一个开关必须使用,因为能让第一个硬币变得只有第一个开关。依次类推,直到遍历完整个得数组。其实你会发现,结果是唯一的一种。#include<cstring>#include<string>#include<iostream>#include<cstdio>using namespace std;int ans=0;int ma原创 2021-08-15 16:43:01 · 115 阅读 · 0 评论 -
95. 费解的开关
95. 费解的开关题目的意思也就是说,给了你一个矩阵。每一个位置做操作都会有连锁的反应的。最后让矩阵都是1.当然次数太多的话返回 -1。它的连锁反应是一个十字的形状。我们可以知道每一个灯最多只能操作一次。因为操作两次的话,就又回去了没啥效果。前面的准备工作好了,那么进一步的分析一下。对于第一行的每次枚举的情况都做处理。即处理第二行、第三行…直到最后一行。处理第二行的时候,看其对应的第一行的灯是不是亮的,如果不是亮的那么点亮。如果是亮的那么不做处理。这样第二行处理完后,可以保证第一行原创 2021-08-15 16:37:38 · 231 阅读 · 0 评论 -
93. 递归实现组合型枚举
93. 递归实现组合型枚举这个相对于全排列来说,不需要顺序了。例: 123 321 这俩是同一种。先画递归树,再判断函数的参数应该传递的参数有哪些。那么,如何才能让它再运行的时候,排除掉重复的信息的呢?只要限制它从小到大排序即可,即只要确保下一个数一定比上一个数大 这个结论很重要。例: 选1之后 ,那么剩下的数必须从 2 ~ n 开始选。接下来分析: 函数的参数都有哪些。首先肯定需要一个数组来保存我们的数据信息。当然这其是一个全局的变量, 就不用在函数里写了。还有一个参数原创 2021-08-15 16:29:53 · 515 阅读 · 1 评论 -
94. 递归实现排列型枚举
94. 递归实现排列型枚举老规矩先画递归树。当 n=3 时假如我们第一次选了 1 那么接下来的选只能从 2和3中选。依次枚举每个位置放哪个数代码实现部分,我们首先得有一个数组来保存我们的方案。还得有一个数组来判断,选数的时候该数是不是在之前已经选走了。#include<cstdio>#include<iostream>int state[10];//0代表还没有选数,1~n代表放了哪个数 bool m[10];//true表示用过,false表示没有用原创 2021-08-15 16:26:14 · 188 阅读 · 0 评论 -
92. 递归实现指数型枚举
92. 递归实现指数型枚举https://www.acwing.com/problem/content/description/94/题解:先画一个递归树分析。我们可以知道的是每个数我们都有选或不选两种选择。我们画一个当n=3时的递归树。那么我们如何用代码实现呢?我们可以写一个函数 dfs(int n) 其中 n代表的是当前第几个数的判断。例如 dfs(0) (数组的下标默认是0) 代表的是第一个元素的判断 即选还是不选。当我们判断的 数的个数达到n说明已经判断完了。就输出,retu原创 2021-08-15 16:24:11 · 222 阅读 · 0 评论 -
107. 超快速排序
https://www.acwing.com/problem/content/109/#include<bits/stdc++.h>using namespace std;const int N=1e5*5+10;int a[N],temp[N],n;long long int res=0;void merge_sort(int l,int r){ if(l>=r) return; int mid=l+r>>1; merge_sort(l.原创 2021-08-15 09:42:28 · 103 阅读 · 0 评论 -
102. 最佳牛围栏
https://www.acwing.com/problem/content/104/#include<bits/stdc++.h>using namespace std;const int N=1e5+10;double a[N],s[N],n,m;bool check(double avg){ for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]-avg; double ans=999999; for(int i=0,j=m.原创 2021-08-15 09:25:39 · 117 阅读 · 0 评论 -
100. 增减序列
https://www.acwing.com/problem/content/102/#include<bits/stdc++.h>using namespace std;const int N=1e5+10;long long int a[N],b[N],n;int main(void){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i]-a[i-1]; long long in原创 2021-08-14 18:45:42 · 191 阅读 · 0 评论 -
99. 激光炸弹
https://www.acwing.com/problem/content/description/101/#include<bits/stdc++.h>using namespace std;const int N=5010;int s[N][N],n,r;int main(void){ cin>>n>>r; r=min(r,5000); while(n--) { int a,b,c; cin>>.原创 2021-08-14 16:43:08 · 84 阅读 · 0 评论 -
95. 费解的开关
题目地址#include<bits/stdc++.h>using namespace std;int t,a[10][10],backup[10][10];int dx[5]={0,-1,0,1,0};int dy[5]={0,0,1,0,-1};void turn(int x,int y){ for(int i=0;i<5;i++) { int tempx=x+dx[i]; int tempy=y+dy[i]; .原创 2021-08-14 14:40:56 · 108 阅读 · 0 评论 -
90. 64位整数乘法
题目地址: https://www.acwing.com/problem/content/92/#include<bits/stdc++.h>using namespace std;typedef long long int LL;LL a,b,p;LL quick_mi(LL a,LL b,LL p){ LL sum=0; while(b) { if(b&1) sum=(sum+a)%p; a=(a+a)%p; .原创 2021-08-14 13:24:21 · 117 阅读 · 0 评论 -
113. 特殊排序
题目地址// Forward declaration of compare API.// bool compare(int a, int b);// return bool means whether a is less than b.class Solution {public: vector<int> specialSort(int N) { vector<int> res; res.push_back(1); for(in..原创 2021-07-22 12:34:30 · 138 阅读 · 0 评论 -
102. 最佳牛围栏
题目地址方法:二分答案二分答案就是用二分来逼近枚举出最大的答案,对于答案来判断合法性。求出每一个数减去平均数的前缀和遍历数组来判断是不是有一个大于等于F的区间满足其和大于等于0注意: 输出的时候要输出r,不然会有精度的问题。因为我们是求的非法的最大值,故要输出大的。#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int N=1e5+10;.原创 2021-07-22 09:50:25 · 127 阅读 · 0 评论 -
841. 字符串哈希
题目地址#include<cstdio>#include<iostream>#include<string>using namespace std;const int N=1e5+10,P=131;typedef long long int LL;LL p[N],h[N];LL query(int x,int y) { return h[y]-h[x-1]*p[y-x+1];//对齐再相减}int main(void){ int n,m; c.原创 2021-06-19 17:38:47 · 148 阅读 · 0 评论 -
840. 模拟散列表
题目地址#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int N=200003,null=0x3f3f3f3f;int h[N];int find(int x)//找到坑位{ int k=(x%N+N)%N; while(h[k]!=null&&h[k]!=x) { k++; if(k==N) k=0;//到最后了,从.原创 2021-06-19 17:33:25 · 117 阅读 · 0 评论 -
900. 整数划分
https://www.acwing.com/problem/content/902/方法一:完全背包的角度来分析完全背包状态表示:f[i][j]表示只从1~i中选,且总和等于j的方案数#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int N=1e3+10,mod=1e9+7;int f[N][N];int main(void){ .原创 2021-06-01 17:05:50 · 131 阅读 · 0 评论 -
哈希表【字符串哈希】
目录前言两种存储方法字符串哈希前言两种存储方法开放寻址法:就是找到对应的坑位,如果坑位上有人了就向后找到空的坑位,如果找到了了最后面,就从头接着找。注意: 数组尽量开大一点,让坑位多一点。拉链法:解决冲突时,就在该位置拉一条链。类似于邻接表。https://www.acwing.com/problem/content/842/开放寻址法:我觉得N开大点有以下几个好处:1、坑位多了,冲突是更容易找到了2、如果开的小的话,假如插入的数把坑位都占了,此时下面的语句在一个查找一个不存在原创 2021-06-01 13:02:30 · 247 阅读 · 0 评论 -
839. 模拟堆
https://www.acwing.com/problem/content/841/#include<cstdio>#include<iostream>#include<string>#include<cstring>#include<algorithm>using namespace std;const int N=1e5+10;int h[N],ph[N],hp[N],cnt;void heap_swap(int a,i.原创 2021-06-01 09:05:59 · 116 阅读 · 0 评论 -
838. 堆排序
https://www.acwing.com/problem/content/840/在进行down操作的时候,只需要让根节点和它的左右儿子结点比较就可以了。#include<cstdio>#include<algorithm>#include<iostream>using namespace std;const int N=1e5+10;int a[N],cnt;void down(int u){ int t=u; if(u*2<=cn.原创 2021-05-31 22:03:18 · 112 阅读 · 0 评论 -
874. 筛法求欧拉函数
上图摘自Acwing的某位大佬:https://www.acwing.com/solution/content/28507/https://www.acwing.com/problem/content/876/#include<cstdio>#include<iostream>using namespace std;const int N=1e6+10;typedef long long int LL;LL phi[N];LL prime[N],cnt;bool..原创 2021-05-31 17:45:34 · 104 阅读 · 0 评论 -
890. 能被整除的数 【容斥定理】
不得不说容斥定理真的好秒啊https://www.acwing.com/problem/content/description/892/先看一个例子:你会发现奇数集合构成的整体我们是加的,偶数集合构成的整体我们是减的。总的扩展如下所示:公式摘自:https://www.acwing.com/solution/content/29702/回到本题,n中可以整除p的个数如下所示:那么如何求一个交集的数的个数呢?例: n中 同时可以整除 p1 和 p2 的个数。那么我们如何来求出.原创 2021-05-31 17:18:56 · 279 阅读 · 0 评论 -
884. 高斯消元解异或线性方程组
https://www.acwing.com/problem/content/886/高斯消元的步骤分为以下几步:枚举每一行找到当前行(包括当前行)下面的,当前列为1的一行。将其找到的这一行移到上面将下面所有的行的当前列都异或成0#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int N=1e2+10;int a[N][N];int.原创 2021-05-31 14:55:56 · 159 阅读 · 0 评论 -
892. 台阶-Nim游戏
https://www.acwing.com/problem/content/894/结论:假设n堆石子,石子数目分别是a1,a2,…,an,如果a1⊕a3⊕a5…⊕an≠0,先手必胜;否则先手必败。即只看奇数的异或和#include<cstdio>#include<iostream>using namespace std;int main(void){ int n; cin>>n; int res=0; for(int i=1;.原创 2021-05-31 12:44:20 · 218 阅读 · 1 评论 -
891. Nim游戏
我感觉好难理解,大致原理懂,但还不是完全的懂。https://www.acwing.com/problem/content/893/首先介绍两种状态 : 必胜状态和必败状态必胜状态: 先手进行某一个操作,留给后手是一个必败状态时,对于先手来说是一个必胜状态。即先手可以走到某一个必败状态。也就是说当我进行操作后,后面的人无论如何搞都是必输的,那么对我来说这就是一个必胜状态。必败状态: 先手无论如何操作,留给后手都是一个必胜状态时,对于先手来说是一个必败状态。先手走不到任何一个必败状态。也就.原创 2021-05-31 11:10:04 · 234 阅读 · 0 评论 -
845. 八数码
https://www.acwing.com/problem/content/847/#include<cstdio>#include<iostream>#include<string>#include<unordered_map>#include<queue>using namespace std;int dx[4]={-1,0,1,0};int dy[4]={0,1,0,-1};int bfs(string state){.原创 2021-05-30 22:56:44 · 131 阅读 · 0 评论 -
844. 走迷宫
https://www.acwing.com/problem/content/846/#include<cstdio>#include<iostream>#include<queue>using namespace std;int n,m;int a[105][105];bool vis[105][105];int dx[4]={-1,0,1,0};int dy[4]={0,1,0,-1};struct node{ int x,y,step;}.原创 2021-05-30 22:54:22 · 172 阅读 · 0 评论 -
843. n-皇后问题
https://www.acwing.com/problem/content/845/#include<cstdio>#include<iostream>#include<string>#include<cmath>using namespace std;int n;int path[15];bool vis[15];void dfs(int index){ for(int i=0;i<index;i++) for(int .原创 2021-05-30 22:49:52 · 581 阅读 · 0 评论 -
842. 排列数字
https://www.acwing.com/problem/content/844/#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int a[8];bool b[10];int n; void dfs(int index){ if(index==n) { for(int i=0;i<n;i++) cout<<a[i]<&.原创 2021-05-30 22:47:28 · 99 阅读 · 0 评论