- 博客(139)
- 收藏
- 关注
原创 2005年浙江大学计算机及软件工程研究生机试真题
题目1010:A + B题目描述: 读入两个小于100的正整数A和B,计算A+B.需要注意的是:A和B的每一位数字由对应的英文单词给出.输入: 测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出.输出: 对每个测试用例输出1行,即A+B的值.样
2016-03-31 09:05:14 1002
原创 2010年浙江大学计算机及软件工程研究生机试真题
题目1008:最短路径问题题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。输入: 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结
2016-03-31 08:55:50 861
转载 并查集详解
并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?)来看一个实例,杭电1232畅通工程首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判
2016-03-30 10:18:08 595
转载 最短路径—Dijkstra算法和Floyd算法
Dijkstra算法1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。问题描述:在无向图 G=(V,E) 中,假
2016-03-29 00:21:34 1850
原创 2011年浙江大学计算机及软件工程研究生机试真题
题目1001:A+B for Matrices题目描述: This time, you are supposed to find A+B where A and B are two matrices, and then count the number of zero rows and columns.输入: The input consists of
2016-03-25 10:12:15 2339
原创 堆排序
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为
2016-03-23 20:51:19 363
原创 快速排序
#includeusing namespace std;int a[100],n;void swap(int *a,int *b){ int t; t=*a; *a=*b; *b=t; } void Qsort(int *a,int left,int right){ int i,j; if(left<right) { i=left; j=right+1; d
2016-03-23 20:39:25 533
原创 冒泡排序
算法思想:第一趟在序列(A[0]~A[n-1])中从前到后进行两个相邻元素的比较,若后者小,则交换,比较n-1次;第一趟排序结束,最大的元素被交换到A[n-1]中,下一趟排序只需要在子序列(A[0]~A[n-2])进行,如果在某一趟排序中未交换元素,说明子序列已经有序
2016-03-23 20:37:52 488
原创 直接插入排序
算法思想:将序列的第一个元素作为一个有序序列,然后将剩下的n-1个元素按照关键字大小依次插入该有序序列,每插入一个元素后依然保持该序列有序,经过n-1次排序后就成为有序序列。#includeusing namespace std;void insert(int *a,int n){ for(int i=1;i<n;i++)//n-1趟 { int j=i; in
2016-03-23 00:21:07 376
原创 简单排序算法
算法思想:将初始序列(A[0]~A[n-1])作为待排序序列,第一趟在待排序序列(A[0]~A[n-1])中找最小值元素,与该序列中第一个元素A[0]交换,这样的子序列(A[0])有序,下一趟排序在待排序子序列(A[1]~A[n-1])中进行。第i趟排序在待排序子序列(A[i-1]~A[n-1])中,找最小值元素,与该子序列中第一个元素A[i-1]交换。经过n-1趟排序后使得初始化序列有序。
2016-03-22 23:52:10 530
原创 高精度--乘法
#include #include #include using namespace std;void multiply(const char *a,const char *b){ int i,j,ca,cb,*s; ca=strlen(a); cb=strlen(b); s=(int *)malloc(sizeof(int)*(ca+cb));
2016-03-22 22:32:30 499
原创 高精度-加法
#include#include#include#include#includeusing namespace std;#define MAX 1010int a[MAX], b[MAX];int main(){ int N, len1, len2, i, k, up, tmp, ncase = 1; string str1, str2; scanf("%d", &N);
2016-03-22 22:14:33 562
原创 POJ 2752 Seek the Name, Seek the Fame
题目大意 :给定一个字符串,求其相同前缀后缀的长度,由小到大输出所有情况题目分析 :用到KMP算法中的next数组,本题时next数组的一种新用法,要深刻理解next数组的含义,由KMP算法的原理可知,通过遍历next[len], next[next[len]].....可以得到所有同时满足是原串的前缀和后缀的子串长度.下标 : 0 1 2 3 4 5
2016-03-22 20:35:16 299
原创 POJ 3461 Oulipo
给两个字符串,在目标串里找到模式串的个数。#include #include char text[1000005];char word[10005];int next[10005];//改进后的next数组,速度更快void get_next() { int j = -1, i = 0; next[0] = -1; while(word[i] !=
2016-03-22 20:23:11 378
原创 POJ 3080 Blue Jeans
题意:就是求k个长度为60的字符串的最长连续公共子串,21、 最长公共串长度小于3不输出。2、 若出现等长的最长的子串,则输出字典序最小的串。算法思路:按字符串的长度由短到长进行快排。枚举第一个字符串的不同长度子串,判断她是否为下面多有的公共子串?如果是的话,那么我们就表明找到,则比较其长度,如果比已经找到的串长,那么就替换结果串 否则按字典序比较。取字典序考前的,就可以。
2016-03-22 20:15:40 427
原创 HDU 3746 Cyclic Nacklace
题目大意:给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。例子:abcabc 已经循环2次,添加数为0abcac 没有循环2次,添加字符abcac。数目为5.abcabcab 已经循环过2次,但第三次不完整,需要添加数为1算法分析:利用kmp的next数组的性质,我们先得到next数组,字符串长度为len,如果next[len] == 0说明这个字符串没
2016-03-22 16:10:47 349
原创 hdu 1867 A + B for you again
题目大意:两个字符串合并成一个,串1的后缀和串2前缀相同部分只出现一次,不固定串1串2,要求合并后串长最小,如果有等串长的两种情况出现,取字典序小的。Sample Inputasdf sdfgasdf ghjk Sample Output asdfg asdfghjk
2016-03-22 15:06:31 500
原创 kmp模式匹配算法
#include #includeusing namespace std;void get_next(char*t, int next[ ]){//确定匹配失败的时候模式串返回的位置 int t_len=strlen(t); int i=0; //求解每个next[i] next[0]=-1; //递推基本条件,然后求解next[i+1] int j=-1;
2016-03-22 10:22:45 641
原创 组织集体活动
题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1081
2016-03-22 00:37:57 425
原创 链表实现栈
#include #include typedef int DataType; //自定义数据类型,假定为整型struct Node; //单链表结点类型typedef struct Node *PNode; //结点指针类型typedef struct Node /
2016-03-21 22:50:27 428
原创 约瑟夫环问题
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。/*用循环链表实现约瑟夫问题*/#include#includeusing namespace std;typedef struct LNode{
2016-03-21 21:56:10 1937
原创 链表实现栈
#include #include typedef int DataType; //自定义数据类型,假定为整型struct Node; //单链表结点类型typedef struct Node *PNode; //结点指针类型typedef struct Node /
2016-03-21 21:54:22 313
原创 链表实现队列
/***********************************************************/// 程序名称:StackOfLink.cpp// 程序目的:设计一个链表实现的队列的程序/***********************************************************/#include #include #define
2016-03-21 21:53:51 390
原创 单链表实现管理系统
/*建立一个结点包括职工的编号、年龄和性别的单向链表,分别定义函数完成以下功能:(1)遍历该链表输出全部职工信息;(2)分别统计出男女性职工的人数;(3)在链表尾部插入新职工结点;(4)删除指定编号的职工结点;(5)删除年龄在60岁以上的男性职工或55岁以上的女性职工结点,并保存在另一个链表中*/#includeusing namespace std;struct n
2016-03-21 21:39:45 2072
原创 链表合并
将两个有序链表合并成一个有序链表。#include #include using namespace std;//定义单链表的接点typedef struct Node{ int data; struct Node * next; }Nodes; //将两个单调递增链表合并成一个 单调递增链表void merge(Node * a,
2016-03-21 20:48:10 581
原创 双向链表的基本操作
双向链表的插入顺序:双向链表的删除顺序:#include #include typedef struct doubleLink { int data; struct doubleLink *pre; struct doubleLink *next; }dnode; //建立链表 dnode* create
2016-03-21 20:30:42 4356 1
原创 带头节点的单链表的基本操作
#include#includetypedef struct node{ int data; node* pNext;}Node;//链表的操作,以带有头节点单链表为例Node* head = NULL;//创建链表,头结点data=0,pNext=NULL;bool createNodeList(){ head = (Node*) malloc(sizeof(Node
2016-03-21 20:07:25 1019
原创 取余运算
题目:输入三个正整数a,p,k,求a(p)%k;算法分析:由于数据规模很大,如果直接计算,不仅需要采用高精度而且时间复杂度很大。已知模运算有如下规则:(a*b)%n=(a%n*b%n)%n a(b)%n=((a%n)(b))%n,因此得到如下的递推公式:#includeusing namespace std;int mod(long long a, lo
2016-03-20 21:58:13 2695
原创 整数因子分解
#include int total;void solve(int n) { if (n==1) total++; else for (int i=2; i<=n; i++) if (n%i==0) solve(n/i);//对每一因子进行递归搜索}int main() { int n; while(scanf("%d",&n)!=EOF) { total = 0
2016-03-20 21:44:18 857
原创 寻找第k小的数字
算法分析:记一趟快速排序后,分解出左子集中元素个数为nleft(1)nleft=k-1,则分界数据就是答案(2)nleft>k-1,则选择问题的答案在左子集中寻找(3)nleft#include using namespace std;#define NUM 1001int a[NUM];//在a[left]~a[right]中寻找第k小的数 int select(int l
2016-03-20 21:16:43 1158
原创 棋盘覆盖问题
//棋盘覆盖问题/*(tr,tc)是棋盘左上角的方格坐标(dr,dc)是特殊方格所在的坐标size是棋盘的行数和列数 */ #includeusing namespace std;int board[1025][1025];static int tile = 1;void ChessBoard(int tr,int tc,int dr,int dc,int size){
2016-03-20 20:34:26 16844 13
原创 循环赛日程表
问题描述: 设有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能参赛一次; (3)循环赛在n-1天内结束。 请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1≤i
2016-03-20 00:13:18 7972
原创 整数的划分
整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi) 例如当n=4时,他有5个划分,{4},{3,1},{2,2},{2
2016-03-19 20:57:34 796
原创 全排列
#includeusing namespace std;void Arrangement(int list[],int k,int m){ if(k==m) { for(int i=0;i<=m;i++) { cout<<list[i]<<" "; } cout<<endl; } else { for(int j=k;j<=m;j++) { sw
2016-03-19 20:50:54 471
原创 zoj1107 fatmouse and cheese
算法分析:dp记忆化搜索+dfs#includeusing namespace std;int grad[100][100],result[100][100];int next[4][2]={{0,1},{0,-1},{1,0},{-1,0}};int n,m;int Search(int x,int y){ int ty,tx; int maxs=0; //大于0说明搜索
2016-03-19 15:43:33 593
原创 zoj1074 to the max
求最大子矩阵和的时候,思路是取出两行i,j,,把这两行之间同一列的都加起来形成另外一个数组,求这个数组的最大子段和,求出来的这个和,就是这两行之间高度为i-j的子矩阵中最大的和.#include#includeusing namespace std;int n,a[100][100],c[100];//求解最大字段和 int maxsegment(){ int i; int s
2016-03-19 14:33:58 338
原创 数字三角形问题
计算从三角形的顶到底的一条路径,使得该路径经过的数字总和最大解题思路:自底向上逐层选择相加,动态规划状态转移方程: t[i][j]=t[i][j]+max(t[i+1][j],t[i+1][j+1]); i=n-2,n-3,n-4.......,0. 0
2016-03-19 10:36:57 1020
原创 最长单调递增子序列
#include#includechar array[10001];int MaxLen[10001];//最长递增子序列void LIS(){ memset(MaxLen,0,sizeof(MaxLen)); int len = strlen(array); for(int i = 0;i < len;i++){ MaxLen[i] = 1; for(int j = 0;
2016-03-18 22:24:01 536
原创 0-1背包问题
#include #define MAX_NUM 5#define MAX_WEIGHT 10using namespace std;//动态规划求解int zero_one_pack(int total_weight, int w[], int v[], int flag[], int n) { int c[MAX_NUM+1][MAX_WEIGHT+1] = {0}; //c[
2016-03-18 21:06:26 1041
原创 最大子段和
#includeusing namespace std;int main(){ int a[100],i,n; int b=0,sum=0; int begin,besti,bestj; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=n;i++) { if(b>0) b+=a[i]; else { b
2016-03-18 21:06:02 776
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人