ACWing
成渝丶
这个作者很懒,什么都没留下…
展开
-
Acwing 867分解质因数
根据算术基本定理,不考虑排列顺序的情况下,每个正整数都能够以唯一的方式表示成它的质因数的乘积。n=p1^a1 * p2^a2 *p3a3…pnan比如一个数16 在分解时先找到2这个质因子,然后由于16/2后还可以/2,所以会在2这个质因子上产生次方不优化版本:从2~n 找到能整除的因子然后算次方提前不满意这个不优化版本这里有个性质:n中最多只含有一个大于sqrt(n)的因子。证明通过反证法:如果有两个大于sqrt(n)的因子,那么相乘会大于n,矛盾。证毕于是我们发现最多只有一个大于sqrt(n转载 2021-11-17 12:41:51 · 158 阅读 · 0 评论 -
Acwing 845. 八数码
题目描述在一个 3×3 的网格中,1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。例如:1 2 3x 4 67 5 8在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 34 5 67 8 x例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3 1 2 3 1 2 3 1 2原创 2021-11-02 16:54:44 · 122 阅读 · 0 评论 -
Acwing 429.奖学金(重载小于号和自定义比较函数)
429. 奖学金某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5名学生发奖学金。期末,每个学生都有 3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。任务:先根据输入的 3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名学生的学号和总分。输入格式输入文件包含 n+1行:第 1行为一个正整数 n,表示该校参加评选的学生人原创 2021-09-29 14:21:10 · 146 阅读 · 0 评论 -
AcWing 422. 校门外的树(区间合并)
422. 校门外的树某校大门外长度为 L的马路上有一排树,每两棵相邻的树之间的间隔都是 1米。我们可以把马路看成一个数轴,马路的一端在数轴 0的位置,另一端在 L 的位置;数轴上的每个整数点,即 0,1,2,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。输入格式输入文件的第原创 2021-09-29 11:54:39 · 113 阅读 · 0 评论 -
Acwing1227. 分巧克力
1227. 分巧克力儿童节那天有 K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有 N块巧克力,其中第 i 块是 Hi×Wi 的方格组成的长方形。为了公平起见,小明需要从这 N块巧克力中切出 K块巧克力分给小朋友们。切出的巧克力需要满足:形状是正方形,边长是整数大小相同例如一块 6×5的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3的巧克力。当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?输入格式第一行包含两个整数 N和 K。以下原创 2021-09-26 09:25:22 · 73 阅读 · 0 评论 -
Acwing680. 剪绳子
思路:使用浮点二分法,判断能否剪出要求的绳子数量,二分出来的就是绳子长度,当长度为x的时候可以剪出要求数量的绳子,那么小于x的都可以剪出来,此时再去看大于x的绳子长度。开始状态:l=0,r=1e9,mid=(l+r)/2。判断能总共剪出长度为 mid 的绳子多少根:总共能剪出的根数=每一根绳子能剪出的根数之和。如果能剪出长度为mid的绳子,则l=mid,如果不能,则r=mid。直到r−l<1e−4。详细代码:#include<iostream>using namespa.原创 2021-09-25 10:44:00 · 64 阅读 · 0 评论 -
ACWING 1346. 回文平方
1346. 回文平方回文数是指数字从前往后读和从后往前读都相同的数字。例如数字 12321就是典型的回文数字。现在给定你一个整数 B,请你判断 1∼300 之间的所有整数中,有哪些整数的平方转化为 B 进制后,其 B进制表示是回文数字。输入格式一个整数 B。输出格式每行包含两个在 B进制下表示的数字。第一个表示满足平方值转化为 B进制后是回文数字那个数,第二个数表示第一个数的平方。所有满足条件的数字按从小到大顺序依次输出。数据范围2≤B≤20,对于大于 9 的数字,用 A 表示 10,用原创 2021-09-21 09:18:55 · 91 阅读 · 0 评论 -
756. 蛇形矩阵
思路:一般来说暂时我想到的就两种思路.一种是运用坐标加上dx[]和dy[]数组来进行移动判断,dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};第二种是模拟法,设置好上下左右的边界,每次换方向就改变边界的条件.详细代码:#include<iostream>using namespace std;const int N = 110;int n,m;int q[N][N];int main(){ cin >> n >>.原创 2021-09-14 11:13:00 · 51 阅读 · 0 评论 -
Acwing 848. 有向图的拓扑序列
代码详解:#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int N = 100010;int n,m;int h[N],e[N],ne[N],idx;int q[N],d[N];void add(int a,int b){ e[idx ] = b,ne[idx] = h[a],h[a] = idx++;}bool t.原创 2021-09-12 12:18:01 · 67 阅读 · 0 评论 -
Acwing 847图中点的层次
详细代码:#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 100010;int n,m;int h[N],e[N],ne[N],idx;int d[N];//存储每个节点离起点的距离 d[1]=0int q[N];//存储层次遍历序列 0号节点是编号为1的节点void add(int a,int b){ .原创 2021-09-12 11:40:51 · 69 阅读 · 0 评论 -
差分的题目
一维差分代码:#include<iostream>using namespace std;const int N = 100010;int n,m;int a[N],b[N];void insert(int l,int r ,int c){ b[l] += c; b[r+1] -= c;}int main(){ cin >> n >> m; for(int i = 1;i<=n;i++)cin >&g原创 2021-05-26 15:36:46 · 86 阅读 · 0 评论 -
石子合并 区间DP
题目:详细过程:f[l,r]表示把l到r合并成一堆的最小代价1.先把区间[l,r]切分为两部分,[l,k]和[k+1,r],k是切分点2.再把两部分[l,k]和[k+1,r]合并在一起,并用前缀和来求区间和3转移方程:f[l,k] + f[k+1,r] + s[r] - s[l-1] -> f[l,r]4.计算f[l,r] = min(f[l,r],f[l,k] + f[k+1,r]+s[r] - s[l-1])5.初值 f[i,i] = 0(合并自己的代价为0),其余为正无穷,便于求原创 2021-03-22 01:16:08 · 82 阅读 · 0 评论 -
多重背包二进制优化
思想:将多重背包问题,全部一个个用二进制拆分出来,转为全部单独的小物品,再用01背包的思想来解决。题目:完整代码:#include<iostream>using namespace std;const int N = 10100;int n,m,v,w,s,vv[N],f[N],ww[N];int main(){ cin >> n >> m; int num =1; for(int i =1;i<=n;i++) {.原创 2021-03-22 00:39:46 · 56 阅读 · 0 评论 -
最短编辑距离(动态规划)
题目:思路:代码:#include<iostream>using namespace std;int f[1010][1010];int main(){ int n,m; string a,b; cin >> n >> a >> m >>b; for(int i =1;i<=n;i++)f[i][0] =i; for(int j =1;j<=m;j++)f[0][j] = j;原创 2021-03-21 23:23:33 · 97 阅读 · 0 评论 -
最长公共子串(动态规划)
题目:最长公共子串(动态规划)题目描述:给定两个字符串,输出其最长公共子串的长度。输入:ABACCBAACCAB输出:3解释:最长公共子串是ACC,其长度为3公共子串:字符必须是连续相等公共子序列:字符必须是相等的,可以不联系代码:#include<iostream>using namespace std;const int N = 1010;int f[N][N];string a, b;int main(){ cin >> a >&g原创 2021-03-21 22:30:43 · 70 阅读 · 0 评论 -
727. 菱形------运用曼哈顿距离
727. 菱形输入一个奇数 n,输出一个由 * 构成的 n阶实心菱形。输入格式一个奇数 n输出格式输出一个由 * 构成的 n阶实心菱形。数据范围1≤n≤99输入样例:5输出样例: * *** ***** *** * 思路:运用到曼哈顿距离,开始的点取中心点,abs(x2-x1)+abs(y2-y1) >n/2则打印空格,否则打印*代码:#include<iostream>using namespace std;#include<原创 2021-03-18 20:24:42 · 146 阅读 · 0 评论 -
前缀和
代码:#include <iostream>using namespace std;const int N = 100010;int n,m;int a[N],s[N];int main(){ scanf("%d %d",&n,&m); for(int i =1;i<=n;i++)cin >>a[i]; for(int i =1;i<=n;i++)s[i] = s[i-1] + a[i];//前缀和的初始化 while(m--.原创 2021-03-16 18:46:20 · 58 阅读 · 0 评论 -
ACWing二分查找笔记
算法基础课3之二分:有单调性一定可以二分,没有单调性也有可能二分第一种: mid = (l+r+1)/2,判断中间值是不是满足性质if(check(mid))如果为真 [mid,r]; l = mid;如果为假 [l,mid-1]; r=mid-1;第二种:mid = (l+r)/2,判断中间值是不是满足性质if(check(mid))如果为真 [l,mid]; r = mid;如果为假 [mid+1,r]; l=mid+1;如何选择用哪一种?先写一个check函数原创 2021-03-15 22:39:16 · 175 阅读 · 0 评论 -
AcWing 788. 逆序对的数量
AcWing 788. 逆序对的数量给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。输入格式第一行包含整数n,表示数列的长度。第二行包含 n 个整数,表示整个数列。输出格式输出一个整数,表示逆序对的个数。数据范围1≤n≤100000输入样例:62 3 4 5 6 1输出样例:5代码:#include<iostream原创 2021-03-15 22:00:32 · 80 阅读 · 0 评论 -
归并排序记录
给定你一个长度为n的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5代码:#include<iostream>using namespace std;const int N原创 2021-03-15 21:06:12 · 58 阅读 · 0 评论 -
快速排序
标准代码记录一下给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5代码:#include<iostream>using namespace std;#i原创 2021-03-15 20:21:02 · 53 阅读 · 0 评论