
数据结构与算法算法
墨白纸黑
新手上路,坚持为主
展开
-
博弈论
/1.找到必输局面2.找到必赢局面3.如果可以使对手面临必输局面,那么是必赢局面4.如果不能使对手面临必输局面,那么是必输局面//巴什博弈:n个物品,最少取一个,最多取m个,最后取完者胜。同余理论#include using namespace std;int main(){int n,m;while(cin>>n>>m)if(n%(m+1)==0) ...转载 2019-03-02 18:51:52 · 206 阅读 · 0 评论 -
搜索(P1036 选数)
题目描述一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:1:转90度:图案按顺时针转90度。2:转180度:图案按顺时针转180度。3:转270度:图案按顺时针转270度。4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。5:组合:图案在水平方向翻转,...原创 2019-04-16 20:56:41 · 100 阅读 · 0 评论 -
贪心
/* 1)贪心的基本思想:求解最优化问题的算法通常要 经过一系列步骤,每个步骤都面临多种选择, 它在每个决策点作出在当时看来最佳的选择, 即总是遵循某种规则,做出局部最优的选择, 以推导出全局最优解(局部最优解->全局最 优解) 2)两个要素:贪心选择性质+最优子结构 1.贪心选择性质:...原创 2019-04-23 16:20:03 · 189 阅读 · 0 评论 -
回溯
/* 1)回溯的基本思想:回溯就是优化的枚举, 运用的是试探的思想,在试探的过程 中,一旦发现原来的选择是错误的, 那么就退回一步重新选择,然后继续 向前试探,反复这样的过程直到求解 出问题的解. 2)回溯的两个要素: 1.dfs...原创 2019-04-23 16:20:50 · 193 阅读 · 0 评论 -
线性表
#include <iostream>using namespace std;#define startsize 100//初始容量#define sizestep 10//当容量不足时扩大容量struct list{ int * data; int length; int size;};//结构体存储线性表的各数据void init(list & nlist...原创 2019-05-28 20:54:01 · 112 阅读 · 0 评论 -
数据结构(一)
数据结构概述定义我们如何把现实中复杂而大量的问题以特定的数据结构和特定的存储功能保存到主存储器(内存)中,以及在此基础上实现某个功能而执行的相应操作,这个相应的操作叫算法 数据结构=个体+个体关系 算法(狭义)=对存储数据的操作算法 算法是解题的方法和步骤 衡量算法复杂度 1.时间复杂度 大概程序要执行的次数...原创 2019-07-13 08:48:33 · 126 阅读 · 0 评论 -
数据结构代码实现(一)
/*二叉树的实现与遍历#include <iostream>#include <malloc.h>using namespace std;typedef struct btnode{ char data; struct btnode * plchild; struct btnode * prchild;}BTNODE,* PBTNODE...原创 2019-07-17 15:58:40 · 394 阅读 · 0 评论 -
并查集
/并查集//当前集合的根就是这个集合的祖先/#include using namespace std;int father[10000+10];//下标代表儿子,数值代表当前儿子的父亲void Unoin(int x,int y);//合并集合int Find(int x);//查找祖先int main(){int n,m,q;cin>>n>>m>...原创 2019-07-31 09:29:06 · 105 阅读 · 0 评论 -
贪心进阶
区间覆盖问题1.不相交区间问题第一步:将右端点从小到大递增排序第二步:第一次选择第一个区间T[0].x-T[0].y,然后选择所有不相交区间#include <iostream>#include <algorithm>using namespace std;typedef struct ds{ int x; int y;}DS;DS T[...原创 2019-08-13 20:44:11 · 205 阅读 · 0 评论 -
算法竞赛宝典-贪心算法
/删数问题#include using namespace std;int main(){string n;cin>>n;int len=n.length();int s;cin>>s;int i,j,k;for(i=1;i<=s;i++){for(j=1;j<len;j++){if(n[j]<n[j-1]){break;...原创 2019-08-13 21:05:55 · 345 阅读 · 0 评论 -
分治进阶
/分治//*#include using namespace std;int main(){return 0;}*//*第k小数1#include #include using namespace std;int n,k,i,j,l;int a[10000+10],b[10000+10];int cmp(int x,int y);void Swap();void...原创 2019-08-14 17:20:45 · 166 阅读 · 0 评论 -
算法竞赛宝典-分治算法
/*分治*//*#include <iostream>using namespace std;int main(){ return 0;}*//*第k小数1#include <iostream>#include <algorithm>using namespace std;int n,k,i,j,l;int ...原创 2019-08-15 09:13:03 · 174 阅读 · 0 评论 -
算法竞赛宝典-递归算法
/递归//*P1498 南蛮图腾#include #include #include using namespace std;int n;char a[5][5],b[3000+10][3000+10];int main(){cin>>n;memset(a,’ ‘,sizeof(a));memset(b,’ ',sizeof(b));}*//*P1049 装...原创 2019-08-15 09:16:48 · 266 阅读 · 0 评论 -
动态规划
/* 1)动态规划的基本思想:将复杂问题进行分解,通过求解 小规模子问题反推出原问题的结果。动态规划适合求解多阶 段决策问题的最优解(可以简单理解为有状态转换的阶段性 问题)。这些问题必须满足最优化原理和子问题的无后向性。 2)动态规划算法分以下4个步骤: 1.描述最优解的结构 2.递归定义最优解的值 ...原创 2019-04-20 20:54:31 · 139 阅读 · 0 评论 -
分治
/*分治算法: 一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”, 就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题 分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子 问题的解的合并。 二、基本思想及策略 分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小 的...原创 2019-04-20 19:46:05 · 133 阅读 · 0 评论 -
大数运算
/大数加法#include #include #include using namespace std;int x[100]={0},y[100]={0},z[105]={0};//将数组元素全部初始化为0int main(){char a[100],b[100];//通过字符串对大数进行输入并储存int len1,len2,len;while(cin>>a>...转载 2019-03-02 18:52:58 · 176 阅读 · 0 评论 -
动态规划(1)
//数字三角形//记忆化搜索#include &amp;lt;iostream&amp;gt;#include &amp;lt;algorithm&amp;gt;using namespace std;#define m 1000int n;int a[m][m];int b[m][m];int solve(int i,int j);int main(){ cin&amp;gt;&a原创 2019-03-06 21:16:39 · 95 阅读 · 0 评论 -
动态规划(2)
动态规划一般只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。动态规划解题步骤(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成,然后编写代码实现)动态规划算法分以下4个步骤:1.描述最优解的结构...原创 2019-03-14 21:04:08 · 145 阅读 · 0 评论 -
数论(1)
/*欧几里得算法int gcd(int a,int b){ return b==0?a:gcd(b,a%b)}lcm(a,b)=a/gcd(a,b)*b;*//*eratosthenes筛法:诶氏筛法int m=sqrt(n+0.5);memset(vis,0,sizeof(vis));for(int i=2;i<=m;i++){ if(vis[i]==0)...原创 2019-03-14 21:08:36 · 139 阅读 · 0 评论 -
数论(快速幂——1008 N的阶乘 mod P)
输入N和P(P为质数),求N! Mod P = ? (Mod 就是求模 %)例如:n = 10, P = 11,10! = 36288003628800 % 11 = 10输入两个数N,P,中间用空格隔开。(N < 10000, P < 10^9)输出输出N! mod P的结果。输入样例10 11输出样例10#include using namespace std...原创 2019-03-19 19:11:49 · 760 阅读 · 0 评论 -
数论(斯特林近似——1130 N的阶乘的长度 V2(斯特林近似))
输入N求N的阶乘的10进制表示的长度。例如6! = 720,长度为3。输入第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000)第2 - T + 1行:每行1个数N。(1 <= N <= 10^9)输出共T行,输出对应的阶乘的长度。输入样例3456输出样例233#include <iostream>...原创 2019-03-19 20:00:09 · 216 阅读 · 0 评论 -
数论(欧拉函数——1136 欧拉函数)
对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler’s totient function、φ函数、欧拉商数等。例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质。输入输入一个数N。(2 <= N <= 10^9)输出输出Phi(n)。输入样例8输出样例4欧拉函数 :欧拉函数是数论中...原创 2019-03-19 20:45:17 · 300 阅读 · 0 评论 -
数论(约瑟夫问题——1073 约瑟夫环)
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。输入2个数N和K,表示N个人,数到K出列。(2 <= N, K <= 10^6)输出最后剩下的人的编号输入样例3 2输出样例3约瑟夫问题是个有名的问题:N个人围成一圈,从...原创 2019-03-20 10:59:47 · 592 阅读 · 0 评论 -
计算几何(1265 四点共面)
给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面)。如果共面,输出"Yes",否则输出"No"。输入第1行:一个数T,表示输入的测试数量(1 <= T <= 1000)第2 - 4T + 1行:每行4行表示一组数据,每行3个数,x, y, z, 表示该点的位置坐标(-1000 <= x, y, z <= 1000)。输...原创 2019-03-21 19:45:40 · 194 阅读 · 0 评论 -
搜索(dfs——1384 全排列)
给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = “1312”,输出为:112311321213123113121321211321312311311231213211输入输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字)输出输出S所包含的字符组成的所有排列输入样例1312输出样...原创 2019-03-22 10:39:10 · 109 阅读 · 0 评论 -
数论(中国剩余定理——1079 中国剩余定理)
一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K。例如,K % 2 = 1, K % 3 = 2, K % 5 = 3。符合条件的最小的K = 23。输入第1行:1个数N表示后面输入的质数及模的数量。(2 <= N <= 10)第2 - N + 1行,每行2个数P和M,中间用空格分隔,P是质数,M是K % P的结果。(2 <= P <= 100, 0...原创 2019-03-22 15:57:37 · 306 阅读 · 0 评论 -
递归
/*递归难不难呢?有一句话叫人理解迭代,神理解递归。 递归是什么:你打开面前的门,看到屋里还有扇门(这门可能跟前面打开的门一样大小(静),也可能门小了些(动)),你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开,。。。, 若干次之后,你打开面前一扇门,发现只有一间屋子,没有门了。 你开始原路返回,每走回一间屋子,你数一次,走到入口的时候,你可...原创 2019-04-20 19:45:16 · 131 阅读 · 0 评论 -
算法竞赛宝典-排序算法
/*计数排序*//*基数排序*//*堆排序*//*快速排序*//*归并排序*/#include <iostream>using namespace std;int a[100000+10];int b[100000+10];void f(int l,int r);int main(){ int n; cin>>n; for(...原创 2019-08-15 09:22:34 · 237 阅读 · 0 评论