
算法
MyLinChi
这个作者很懒,什么都没留下…
展开
-
用c++实现基于vector的迪杰斯特拉算法
本程序的实现是在linux redhat,vmware下实现的,使用的是g++编译器,如何读者使用其他的编译器,可能需要小改一下代码~~#include#include#include#include#include#define INF 1147483646#define maxn 50using namespace std;vector edges[maxn];//the原创 2016-11-03 13:25:12 · 1539 阅读 · 0 评论 -
442 - Matrix Chain Multiplication
#include#include#includeusing namespace std;struct Matrix{ int a,b; Matrix(int a=0,int b=0):a(a),b(b){}} mats[26];int main(){ int N; cin>>N; for(int i=0;i<N;i++) { char num;原创 2016-11-27 18:57:11 · 479 阅读 · 0 评论 -
八数码问题
问题描述:如下如所示,a,b分别表示两种状态,每个九宫格中的数字都是0~8共9个数字的任意一种排列,现在要把算出a状态移动到b状态的最佳步骤(移动步数最少)。移动的规则是0方块与上下左右任意一块互换位置。问题分析:把每种状态看成一个结点,0块与上下左右块互换位置后形成的状态为之前状态的相邻结点。由此可以见,不过是一个用BFS搜索最短路径的问题。那么问题来了,由于9和数字的全排列原创 2016-12-17 21:52:24 · 2272 阅读 · 2 评论 -
最大连续和
问题描述:给出一个长度为n的序列,求出最大连续和。就是找出1尽量大。方法一:直接枚举i,j,找出连续和最大的i,j。#include#includeusing namespace std;int A[1000],n;int main(){ cin >> n; for (int i = 1; i > A[i]; int sum = A[1]; for (int i =原创 2016-12-17 22:00:02 · 900 阅读 · 1 评论 -
归并排序
归并排序是一种高效算法,按照分治的三步法,归并排序的三个步骤如下:划分问题:把序列划分为尽量相等的两半。递归求解:把两半元素分别排序。合并问题:把两个有序表合并为一个。总结为一句话就是,先排列最小的两个相邻的数然后合并两个相邻的序列。程序流程图如下:程序实现如下:#includeusing namespace std;void merg_sort(in原创 2016-12-17 22:06:27 · 664 阅读 · 1 评论 -
求直线上的整数点算法
问题描述:求直线上有多少个整数点(x,y)满足。问题分析:把直线方程进行移项,得到。假设已经得到直线上一个点的坐标,假设直线存在另外一个点坐标为,那么把两点代入直线得到方程,整理得到。假设,上上式两边同除g,可以得到,其中。把等式再变形得到,此时的和互素,必定是的整数倍,即k可以为任意整数。整理得到,。由上面的分析知道,只需要就出方程的任意一组解,就可以求出其他解。原创 2016-12-17 22:24:59 · 4657 阅读 · 2 评论 -
大整数取模
问题描述:输入正整数n和m,输出n mod m的值。问题分析:根据n和m的取值范围,可以取n为char*类型,m为int类型。首先mod运算具有如下性质:需要注意的是,有可能小于0,所以要先加n。而当n=时,中间结果会溢出,所以计算时应该先强制类型转换为long long 型。对于输入的n,把大整数写成“自左向右”的形式:1234=((1*10+2)*10)*10+4,然后原创 2016-12-17 22:31:55 · 4490 阅读 · 2 评论 -
幂取模算法
问题描述:输入正整数a、n和m,输出的值。方法一:依此乘以a并取模#include#includeusing namespace std;int pow_mod(int a, int n, int m){ int ans = 1; for (int i = 0; i < n; i++)ans = (int)((long long)ans * a % m); return a原创 2016-12-17 22:35:55 · 693 阅读 · 1 评论 -
李开复:算法的力量|万变不离其中
程语言虽然该学,但是学习计算机算法和理论更重要,因为计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门就产生了一种误解,认为学计算机就是学各种编程语言,或者认为原创 2016-12-18 00:03:20 · 629 阅读 · 0 评论 -
用C语言实现基于二叉搜索树的时钟管理程序
二叉搜索树具有平均操作时间复杂度为O(lgn)的优点,其实现的主要难点在删除操作。项目中需要给一些任务设定超时机制,因此需要用到时钟管理。但平台使用的是c语言,因为没有引用,实现起来特别麻烦(要涉及三重指针)。一下是程序部分:#define _CRT_SECURE_NO_WARNINGS#include#include#define i32 int#define u32 unsigne原创 2018-01-04 19:56:18 · 396 阅读 · 0 评论 -
字符串哈希函数
1.简介本文将介绍什么是字符串哈希函数,字符串哈希函数常见用法,以及字符串哈希函数的实现原理和常用算法。2.概念哈希之所以广泛存在,是因为它能在绝大多数情况下可以在O(1)的时间复杂度中完成元素的查找。它的核心是数组,如果输入是一个自然数,那么当然可以在常数时间内搜索到自然数所对应的数组元素了。但在工程实践中,要查找的关键字往往都不是自然数,即使是自然数也有可能是很大的值。因此,只要我们提前把关键...原创 2018-03-10 16:58:16 · 13109 阅读 · 3 评论 -
哈希表之bkdrhash算法解析及扩展
BKDRHASH是一种字符哈希算法,像BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等,这些都是比较经典的,通过http://blog.youkuaiyun.com/wanglx_/article/details/40300363(字符串哈希函数)这篇文章,我们可知道,BKDRHash是比较好的一个获取哈希值的方法。下面就讲...转载 2018-03-10 17:00:47 · 4889 阅读 · 0 评论 -
每日一题1.求数组中使得x + y为某个数的x,y的下标
问题描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]思路一...原创 2019-09-27 18:03:32 · 360 阅读 · 0 评论 -
每日一题2.最长回文串
问题描述给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”问题分析要判断一个字符串是不是回文串有点难,但如果知道它的字串是回文串,再结合新进去的字符是否符合要求,就可以只考虑当前状态而做出决策,也就是动态...原创 2019-09-27 21:14:32 · 394 阅读 · 0 评论 -
514 - Rails
#include#include#includeusing namespace std;deque Br;vector Cr;int A,N;void compu(int N){ Cr.clear(); A=1; while(!Br.empty()) { int t=Br.front(); Br.pop_front(); if(Cr.empty()原创 2016-11-27 15:23:07 · 432 阅读 · 1 评论 -
210 - Concurrency Simulator
#include#include#include#include#include#include#include#includeusing namespace std;vector prog[11];map var;deque ready;queue blocked;int runId,n,Q;int itime[6];int ip[11];int locknum原创 2016-11-27 13:07:05 · 415 阅读 · 0 评论 -
刘汝佳《算法竞赛入门经典》推荐题目
题号全部为uva题号另附两个参考网站:1.uva崩的时候用下面这个可以代替http://acm.hust.edu.cn/vjudge/problem/toListProblem.action2.没有输入的正确答案可以用下面这个生成http://uvatoolkit.com/problemssolve.PHP一、基础题目1.转载 2016-12-04 22:05:00 · 1776 阅读 · 0 评论 -
UVa Online Judge参考程序集合
一下为本人在UVa Online Judge系统正确提交的代码,附上一定的解释,以次给广大编程爱好者作为参考~~原创 2016-11-13 15:23:16 · 1352 阅读 · 0 评论 -
1592 Database
程序源码:#include#include#include#include#includeusing namespace std;vector vs;set ss;string tables[10002][12];int table[10002][12];map s2i;map v2r;void split(const string& src,const strin原创 2016-11-13 15:14:24 · 522 阅读 · 1 评论 -
207 - PGA Tour Prize Money
#include#include#include#include#include#include#includeusing namespace std;int flag=1;struct person{ string name,place,money,total; string r[5]; int ir[5]; int two; bool major;原创 2016-11-15 17:10:55 · 596 阅读 · 0 评论 -
C++/C中基于数组的链表(静态链表)
1.用数组描述的链表,即称为静态链表。在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标CUR。游标指示器指示其后继结点在结构数组中的相对位置(即数组下标)。定义如下:const int maxn=10000;struct StaticNode{ ElemType data; int cur;};StaticNode StaticList[max原创 2016-12-02 22:43:35 · 2991 阅读 · 0 评论 -
814-The Letter Carrier's Rounds
#include#include#include#include#includeusing namespace std;void split_address(const string& src,string& user,string& mta){ int k=src.find('@'); user=src.substr(0,k); mta=src.substr(k+1)原创 2016-11-21 19:30:06 · 444 阅读 · 0 评论 -
VC中为了调试方便如何把输入输出重定向到文件中?
只需在main函数的前面添加下面两句即可。 freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); 然后在in.txt文件中放入输入的内容运行程序后会在out.txt中输出答案注意:以上两个文件都处在和源文件一样的目录下。原创 2016-11-21 20:09:09 · 1655 阅读 · 0 评论 -
C++中的freopen()函数实现比较两个文件的内容是否相同
程序很简单,主要使用了一个freopen()函数。具体的用法是:函数名:freopen 声明:FILE *freopen( const char *path, const char *mode, FILE *stream ); 所在文件: stdio.h 参数说明: path: 文件名,用于存储输入输出的自定义文件名。 mode: 文件打原创 2016-11-21 21:06:24 · 7876 阅读 · 0 评论 -
C++中整型随机数发生器的写法
#include#includeusing namespace std;int main(){ for(int i=0;i<100;i++) cout<<int((double)rand()/RAND_MAX*100)<<endl; return 0;}rand()函数在头文件cstdlib中,RAND_MAX是可以rand()返回值的上限。为了得到一个[0,1]之原创 2016-12-03 23:31:29 · 610 阅读 · 1 评论 -
全排列算法
所谓全排列算法,就是输入n个数据,然后输出该n个数据的所有的排列情况。1.每个元素不相同情况下的排列。排列的用计算机程序的思路来考虑就是递归地往数组A里添加元素的过程,如果放完了元素就输出并回溯。为了形象说明情况,我们举个例子,并给出算法的流程图和程序实现。demo:输入n,输出1~n的全排列。流程图:程序实现:#includeusing namespace st原创 2016-12-11 22:13:00 · 1406 阅读 · 1 评论 -
八皇后问题
1. 问题:在棋盘上放置8个皇后,使得它们互不攻击,每个皇后的攻击范围为同行同列和同对角线,要求找出所有解。思路:不难发现恰好每行每列放置一个皇后,如果用C[x]表示第x行皇后的列编号,则问题变成了全排列生成的问题。流程图如下:代码实现:#include#includeusing namespace std;int n,cnt;int C[100];void原创 2016-12-12 23:14:00 · 730 阅读 · 1 评论 -
素数环问题
问题:输入正整数n,把整数1,2,3,…,n组成一个环,使得相邻两个整数之和均为素数。输出时从整数1开始逆时针排列。n样例输入:6样例输出:1 4 3 2 5 61 6 5 2 3 4方法一:直接枚举法#include#include#includeusing namespace std;int isp[200],A[200];int is_prime(int原创 2016-12-12 23:16:23 · 2112 阅读 · 1 评论 -
子集生成算法
1. 增量构造法基本思路:一次选出一个元素放到集合中。算法流程:使用前序遍历的方法,因为A中元素个数不确定,每次递归调用都要输出当前集合。另外,为了避免出现类似于{1,2}按照{1,2}和{2,1}输出两次,可以使用定序的技巧,即规定集合A中所有元素的编号从小到大排列,对应于程序中的int s=cur?A[cur-1]+1:0;和for(int i=s;i#incl原创 2016-12-12 23:28:21 · 1055 阅读 · 1 评论 -
122 - Trees on the level
#include#include#include#includeusing namespace std;const int maxn=10000+5;struct Node{ bool have_value; int v; Node *left,*right; Node():have_value(false),left(NULL),right(NULL){}};b原创 2016-12-04 21:37:26 · 483 阅读 · 0 评论 -
每日一题3:两数相加
问题描述给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 ...原创 2019-10-06 16:12:54 · 348 阅读 · 0 评论