自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

夜阑優琿

我是真的呆。

  • 博客(53)
  • 收藏
  • 关注

原创 ALDS1_6_A: Counting Sort

题解计数排序中需要设置一个以数组a元素范围为大小的中间数组c,c[i]的意义是“数组a中小于等于i的元素个数”。排序的操作是新建一个数组b,然后在其c[a[i]]的位置放入元素a[i],放入后c[a[i]]–。只要在排序中i是从后往前,计数排序就属于稳定的排序算法,时间复杂度为O(n+k),k是a中元素的范围大小。如果i从前往后,那么重复出现的元素将以逆序复制到b中。为了方便以及考虑到计数排序的原理,这里a中的元素不能有负值,并且数组a和b要从1开始存储,而数组c从a的最小值存到a的最大值。题

2021-01-23 14:39:23 102

原创 ALDS1_6_C: Quick Sort

题解这题判断稳定性不能用冒泡排序来比较,应该用归并排序来。这里的n可以很大,所以n2的时间复杂度会TLE。归并排序的时间复杂度为O(n*logn),并且是稳定的。如果是从小到大排序,则归并排序在Merge的时候必须将等于的情况和小于归在一起才稳定,这一点和冒泡排序是一样的。快排和归并排序其实是一对的。快排是先排序,再对基准分割成的两个序列快排。归并是先分割成两个等长的序列,再分别对这两个序列归并。(类似于树的先序遍历和后序遍历的先处理和后处理)由于每次快排中的基准不需要参加下一次快排,所以下次快排

2021-01-23 13:37:40 116

原创 ALDS1_6_B: Partition

题解这里的分割是以数组中的最后一个元素为基准,最终的结果要让其左边的所有元素小于其,其右边的所有元素大于其。这里设置了一个遍历变量j,其从第一个元素遍历到最后一个元素,被其遍历过的部分分成小于等于和大于a[n-1]的两部分,设置一个变量i来分隔这两部分,[0,i]部分小于等于a[n-1],(i,j)部分大于a[n-1]。遍历中如果a[j]大于a[n-1],则什么都不用做,j继续向后,该元素会自动划入大于a[n-1]的部分;如果a[j]小于a[n-1],则i加一,然后将a[i]和a[j]互换,j继续向

2021-01-23 11:29:15 139

原创 ALDS1_5_B: Merge Sort

题解这里的MergeSort负责将数组分割(每层分治为两部分),Merge负责整合。Merge函数将有序的left-mid和mid-right部分(都是左闭右开)整合成一个有序序列。整合过程首先用两个数组将这两部分分别装出来,然后以right-left为次数建立一个for循环,每次从两个数组中选取较小者装回原数组。可以直接用for循环操作,而不用担心一个数组已经取完了的情况,就在于这里在两个数组的末尾都添加了一个大值元素,其可以使得取完后比较继续并且不会被选中。题目Merge SortWri

2021-01-22 18:08:19 96

原创 ALDS1_5_C: Koch Curve

题目Koch CurveWrite a program which reads an integer n and draws a Koch curve based on recursive calles of depth n.The Koch curve is well known as a kind of fractals.You can draw a Koch curve in the following algorithm:Divide a given segment (p1, p2)

2021-01-22 14:20:35 110

原创 ALDS1_5_A: Exhaustive Search

题解这里用的思路是:每次选择针对每个元素,每个元素都只有选与不选两种情况,所以共有2n种选择,并且这里将这些组合通过递归生成。递归思路:这里的原问题即为solve(a, n, 0, m),即这2n种组合中是否有和为m的,其中的子问题就是solve(a, n, i, m),即在确定了前i个元素下其后面的元素能否组合出m。然后将solve(a, n, i, m)分治为:solve(a, n, i+1, m)和solve(a, n, i+1, m-a[i]),即每个子问题都将其分治为其下一个元素的选或不选,

2021-01-22 12:09:16 130

原创 ALDS1_4_D: Allocation

题解常规解题思路:让每辆卡车的最大运载量P从0递增,第一个让总运载数v达到n的P就是答案。但是其时间复杂度为O(Pn),会时间超限。优化方案:抓住“P增加时v不可能减少”的性质,可以将原来的“从0开始顺序查找P”改造成“二分法查找P”。题目中每个P都对应一个v,而题目要找到第一个达到n的v,也就是查找思想,而这里如果v序列是不减的就可以用二分查找了。题目You are given n packages of wi kg from a belt conveyor in order (i=0,1,.

2021-01-21 19:15:11 207

原创 ALDS1_4_C: Dictionary

题解散列表由容纳m个元素的数组T,以及根据数据关键字决定数组下标的函数共同组成。也就是说要将数据的关键字输入该函数,由该函数决定数据在数组中的位置。当关键字为字符串等其他类型时,函数需要将其转化为相应的整数下标。相比于链表等数据结构,散列表的优点在于如果忽略发生冲突地情况,插入和搜索元素的算法时间复杂度仅为O(1)。这里解决冲突用的方法是开放定址法中的双散列结构,散列函数H(k)=h(k,i)=(h1(k)+i*h2(k)) mod m。这里面m代表散列表长,对其取余可以使得散列地址一定位于表长内。

2021-01-21 16:20:47 80

原创 ALDS1_4_B: Binary Search

题目Search IIYou are given a sequence of n integers S and a sequence of different q integers T. Write a program which outputs C, the number of integers in T which are also in the set S.InputIn the first line n is given. In the second line, n integers ar

2021-01-21 10:55:55 78 1

原创 ALDS1_4_A: Linear Search

题解向线性搜索中引入”标记“可以将算法效率提高常数倍。所谓标记,就是在数组等数据结构中设置的一个拥有特殊值的元素。借助这项编程技巧,可以达到简化循环控制等诸多目的。在这里的线性搜索中,将含有目标关键字的数据作为标记放在数组的第n位。这样从前往后查找,如果在第n位才查找成功就说明查找失败。题目Search IYou are given a sequence of n integers S and a sequence of different q integers T. Write a prog

2021-01-20 22:28:11 75

原创 ALDS1_3_D: Areas on the Cross-Section Diagram

题解这题可以将每一处的积水视为一行一行的积水组合而成,这样每行的积水面积就是其’\‘和’/‘相隔的距离,如果’\‘的位置是i,’/'的位置是j,则该行积水的面积为j-i。因此可以设置一个整型元素栈s1,每次遇到’\‘就入栈其的位置,每次遇到’/‘并且栈不空就出栈计算距离。每次计算得到的距离与’\'的位置组合成一对整型数据入栈s2(用来保存各积水的面积)。这里存’\‘位置是为了判断是否是同一处积水,如果栈顶元素的’\‘位置要比入栈元素的’\'位置大就说明是同一处积水,要出栈合并。这里在设置栈s2元素的

2021-01-20 22:06:26 154 1

原创 ALDS1_3_C: Doubly Linked List

题解请使用更高速的输入输出函数,如果是C++则将cin改为scanf、cout改为printf,运行时间会降低很多。如果C++中不需要使用cin和cout则不需要包含头文件iostream,也不用再用std命名空间,改用scanf和printf只要包含cstdio就行了。这题一开始以为是双向链表,实际上是双向循环链表,在设置头结点的时候要让head->next和head->prior都指向head。如果不视为循环链表,则deleteLast需要从头遍历到最后,导致时间超限。删除操作和插入

2021-01-20 17:44:43 124

原创 ALDS1_3_B: Queue

题目QueueThere are n processes in a queue. Each process has namei and timei. The round-robin scheduling handles the processes in order. A round-robin scheduler gives each process a quantum (a time slot) and interrupts the process if it is not completed by

2021-01-19 21:09:25 83

原创 ALDS1_2_D: Shell Sort

题解插入排序:插入排序设置一个变量i向后遍历,然后每次遍历中先将第i个元素存起来,然后再将其从后到前分别和前i个元素比较,如果更大就将其覆盖到被比较元素的下一个,如果更小则将被比较元素覆盖到被比较元素下一个。因此插入排序中i从1开始。由于这里第i个元素并不是一定要和所有的前i个元素比较,而是遇到比第i个元素小的元素就停止,所以用while比用for要合适。当希尔排序中的g数组=1,4,13,40,121…时,即gn+1 = 3*gn+1时,算法的时间复杂度基本维持在O(n^1.25),是g

2021-01-19 20:44:50 109

原创 ALDS1_2_C: Stable Sort

题解选择排序:设定变量i向后遍历,每次遍历都选取下标i和所有下标大于i中数组值最小的,然后将其的数组值和i的数组值交换。选择排序中只需要设置一个数组最小值的下标变量就行了,不需要设置数组最小值变量,记录了数组中最小值的下标就等于记录了数组中的最小值。每次最小值变量更新后不需要交换相应数组元素,等遍历完一次选到了最小值下标再将其和第i个元素交换。结构体:这里代表卡片的输入是字符型加整型,普通的处理是整个的视为字符串,但是这样处理起来会很痛苦。因此可以将卡片视为一个结构体类型,其中包含花色

2021-01-19 16:59:07 80

原创 DS双向链表—祖玛

题解这题用链表不用线性表的原因是会有很多在表中插入和删除的操作,链表在插删时会简单很多。而用双向链表是因为一次消除后要同时向前和向后遍历,使得链表又兼具线性表方便遍历的性质。双向链表在操作上会和链表有所不同,比如插入操作:过程见附图。代码中涉及到很多链表中指针移动的操作,对该操作除了一些附加条件,一定要加的条件就是不能让其指向NULL或者head之类,反正就是移动要限制在一定范围,不然指针很容易会越界。题目问题 D: DS双向链表—祖玛时间限制: 1 Sec 内存限制: 128 MB提交

2021-01-08 19:11:58 1714 1

原创 数据结构

数据结构1.线性表链表:尾插法创建单链表: 对于插入的节点,其在插入前Next域都要置空为NULL,否则创建的单链表最后一个节点的Next域不为空,会导致遍历其时找不到尾节点的NULL,遍历无法停止报错;而且头节点在创建后Next域也要置空,以表示其为一个空表,然后再插入其他节点。...

2021-01-08 18:47:07 244

原创 顺序表练习

题解这道顺序表的题在查找操作这里容易踩坑,这里用的是课本上查找单元中的顺序查找的方式,即数组要从下标1开始存数,每次查找将带查找元素放在下标0的位置,比较时从后往前比较,所以如果查找失败比较次数为n+1。题目问题 A: 顺序表练习时间限制: 1 Sec 内存限制: 128 MB提交: 822 解决: 158[提交][状态][讨论版]题目描述 给出顺序表的初始数据,实现顺序表的定义、创建、插入、删除与查找操作。输入 测试次数t每组测试数据格式如下:第一行: 正整数n,后跟

2021-01-08 16:35:36 426

原创 题目:求集合的所有子集

题目问题 A: 求集合的所有子集(数组)时间限制: 1 Sec 内存限制: 128 MB提交: 390 解决: 96[提交][状态][讨论版]题目描述一个元素个数为n(n>0)的集合,有2n个子集(包括空集)。例如,集合A={a,b,c}的子集有23=8个,分别为:{}(空集)、{a}、{b}、{a、b}、{c}、{a,c},{b,c},{a,b,c}。输入一集合(假设集合元素为字符),给出该集合的所有子集。子集的输出顺序根据样例输出分析得出。输入测试次数t每组测试数据格

2021-01-07 22:45:34 750

原创 LaTeX

。。。

2021-01-07 20:16:35 84

原创 题目:数独验证

题目问题 F: 数独验证(二维数组,函数)时间限制: 1 Sec 内存限制: 128 MB提交: 101 解决: 57[提交][状态][讨论版]题目描述数独是一种填数游戏,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。每个数独有唯一解。下图是一个数独填数后的解(黑色数字是已知数字,绿色数字是填数数字)。输入填数后的9×9盘面,写函数判断其是否是解,返回1或0。输入测试次数每组测试数据是

2021-01-06 23:13:38 1208

原创 题目:整数转字符串

题目问题 E: 整数转字符串(递归)时间限制: 1 Sec 内存限制: 128 MB提交: 1000 解决: 605[提交][状态][讨论版]题目描述写递归函数void itostr(int num,char str[]),函数功能是将一个整数num转换为字符串str,如整数135,转换为字符串“135”。主函数如下,不可修改。itostr每次独立调用。不可以为实现itostr的递归定义全局变量。输入测试次数tt个整数输出每个整数,输出转换后的数字字符串样例输入5

2021-01-06 22:40:46 440

原创 题目:盗梦空间

题解代码2的思路是num从初值60开始,如果IN就除20,如果OUT就乘20。代码1的优化是num从1开始,如果IN就除20,如果OUT就除20。在进行精确运算的时候,要避免使用浮点数。浮点数由于计算机位数有限,所以对于一些无限小数来说都只是近似值,与实际值存在误差。这里将原本的乘浮点数转化成了除整型数,从而避免了浮点数参与计算。代码1中num的初值讲道理应该对应1/60,这里也将60提出来,num初值就是整型1了,60在num参与运算的时候再除上去。题目问题 F: 盗梦空间时间限制: 1

2021-01-06 20:19:29 679

原创 算法的基本思想

的方式

2021-01-05 23:34:30 2548

原创 题目:LELE的RPG难题

题解这题一开始while头那里忘加!=EOF了,搞的一直TLE(因为一直不会停),如果是cin才是不要加的,scanf要加。这题的递推的子结构是:除了1,2,3的值是3,6,6以外,其他的都符合a[i] = a[i-1]+2*a[i-2](如果第i-1个方格和第一个方格颜色相同,则第i个方格有两种颜色可以涂,而第1格和第i-1格颜色相同的数量就等于a[i-2],所以这种情况对应2*a[i-2];如果第i-1个方格和第一个方格颜色不同,则第i个方格只能涂一种颜色,而第1格和第i格颜色相同的数量等于a[i

2021-01-05 23:02:19 672

原创 题目:人口数量排行

题解这题遇到了一个问题:如果用浮点型来保存人口,则在用printf("%f")来输出时小数部分会输出无效0凑满6位,即使加上格式控制输出的小数位数也是固定的,不能保持每组都和输入的小数位数一样。(cout输出或%g格式输出都可能会吞掉几位小数)解决办法:用字符串来保存人口,当需要将其作为整型使用时,可以用stdlib.h下的atoi函数,作用就是将整数意义的字符串化为整型数据。题目问题 D: 人口数量排行(数组,结构体)时间限制: 1 Sec 内存限制: 128 MB提交: 104 解决

2021-01-05 21:15:56 204

原创 题目:矩阵运算

题目问题 Q: 矩阵运算时间限制: 1 Sec 内存限制: 128 MB提交: 1187 解决: 715[提交][状态][讨论版]题目描述两个m×n矩阵A和B的加,标记为A+B,一样是个m×n矩阵,其内的各元素为A、B相对应元素相加后的值。设A为 的矩阵,B为 的矩阵,那么称 的矩阵C为矩阵A与B的乘积,记作 ,其中矩阵C中的第 行第 列元素可以表示为A的第i行与B的第j列对应元素乘积和.输入测试次数t每组测试数据格式如下:矩阵阶数n(0<n<1

2021-01-05 19:29:42 812

原创 题目:部分和问题

题解这题是关于递归的经典例题,题解全部位于代码注释中。题目问题 F: 部分和问题(数组,函数)时间限制: 1 Sec 内存限制: 128 MB提交: 683 解决: 293[提交][状态][讨论版]题目描述给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为k。输入有多组测试数据。每组测试数据两行:第一行:正整数n、整数k,n表示数的个数,k表示数的和。第二行:n个数输出每组测试数据,如果和恰好可以为k,输出“YES”,并按输入顺序

2021-01-05 16:52:52 311

原创 DS排序--希尔排序

题目DS排序–希尔排序题目描述给出一个数据序列,使用希尔排序算法进行降序排序。间隔gap使用序列长度循环除2直到1输入第一行输入t,表示有t个测试示例第二行输入n,表示第一个示例有n个数据(n>1)第三行输入n个数据,都是正整数,数据之间用空格隔开以此类推输出对每组测试数据,输出每趟排序结果。不同组测试数据间用空行分隔。样例输入26111 22 6 444 333 55877 555 33 1 444 77 666 2222样例输出444 333 55

2021-01-05 16:52:38 402

原创 DS排序--快速排序

题目问题 C: DS排序--快速排序时间限制: 1 Sec 内存限制: 128 MB提交: 480 解决: 303[提交][状态][讨论版]题目描述给出一个数据序列,使用快速排序算法进行从小到大的排序--程序要求--若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio程序中若include多过一个头文件,不看代码,作0分处理不允许使用第三方对象或函数实现本题的要求输入第一行输入t,表示有t个测试示例第二行输入n,表示第一

2021-01-05 16:52:28 1108 9

原创 DS内排—2-路归并排序

题目问题 E: DS内排—2-路归并排序时间限制: 1 Sec 内存限制: 128 MB提交: 187 解决: 134[提交][状态][讨论版]题目描述输入一组字符串,用2-路归并排序按字典顺序进行降序排序。输入 测试次数t每组测试数据:数据个数n,后跟n个字符串,字符串不含空格。输出 对每组测试数据,输出2-路归并排序的每一趟排序结果。每组测试数据的输出之间有1空行。样例输入26 shenzhen beijing guangzhou futian nanshan b

2021-01-05 16:52:19 634

原创 基数排序

题目问题 F: 基数排序(内部排序)时间限制: 1 Sec 内存限制: 128 MB提交: 238 解决: 117[提交][状态][讨论版]题目描述给定一组数据,对其进行基数升序排序。输入测试次数t每组测试数据一行:数字个数n,后跟n个数字(整数)注:如果序列中有负数,则每个数字加上最小负数的绝对值,使序列中的数均大于等于0。排序后再减去最小负数的绝对值。输出对每组测试数据,输出每趟分配、收集的结果。若分配中该位没有数字,输出NULL。具体输出格式见样例。每组测试数据间以

2021-01-05 16:52:07 425 2

原创 题目:上车人数

题解这里上车人数是递归的,车上人数也是递归的,可以分别设立两个递归函数,功能就是得到每站的上车人数和车上人数,这样解题会方便许多。题中第二站的上车人数x没有告诉,而是间接告诉其他站的车上人数,数学思维的话就是逆向解出x,但代码中不允许变量,所以应该是让x自增1一个一个去试,如果相应站的人数等于m就是题中的情况了。题目问题 C: 上车人数(递归)时间限制: 1 Sec 内存限制: 128 MB提交: 774 解决: 581[提交][状态][讨论版]题目描述 公共汽车从始发站(称为第1

2021-01-05 16:51:51 877

原创 题目:N皇后问题

题解根据皇后不能同行同列的性质可以知道,要在N*N棋盘上摆N个皇后则每行最多一个皇后,所以在暴力解的时候不需要每个皇后都遍历N *N种可能,只需要对该皇后对应行的N种可能遍历就行了(这里一层递归就代表一行,也就是一个皇后,以递归形参i来控制)。直接用一个二维flag数组来标志棋盘上哪些格子可以放皇后,而每当在(i,j)放入一个皇后就要将其同排同列和上下斜线的格子flag置1,分别对应k = = i || r = = j || (k+r) = = (i+j) || (k-r) = =(i-j)。题目

2021-01-05 16:51:29 188

原创 DS内排—堆排序

题目题目描述给定一组数据,使用堆排序完成数据的降序排序。(建小顶堆)。输入数据个数n,n个整数数据输出初始创建的小顶堆序列每趟交换、筛选后的数据序列,输出格式见样例样例输入8 34 23 677 2 1 453 3 7样例输出8 1 2 3 7 23 453 677 348 2 7 3 34 23 453 677 18 3 7 453 34 23 677 2 18 7 23 453 34 677 3 2 18 23 34 453 677 7 3 2

2021-01-05 16:51:06 817

原创 题目:6174问题

题目问题 F: 6174问题时间限制: 1 Sec 内存限制: 128 MB提交: 444 解决: 244[提交][状态][讨论版]题目描述假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数

2021-01-05 16:48:55 489

原创 题目:万圣节派对

题目问题 D: 万圣节派对(函数)时间限制: 1 Sec 内存限制: 128 MB提交: 348 解决: 89[提交][状态][讨论版]题目描述万圣节有一个Party,XadillaX显然也要去凑热闹了。因为去凑热闹的人数非常庞大,几十W的数量级吧,自然要进场就需要有门票了。很幸运的,XadillaX竟然拿到了一张真·门票!这真·门票的排列规则有些奇怪:门票号是由0~6组成的六位数(0~6这几个数字可重用)每一个门票号的每一位不能有三个连续相同的数字(如123335是不行的)每一

2021-01-05 15:53:05 544

原创 题目:矩阵取数问题

题解代码2中每层递归函数包含三次递归,时间复杂度直接起飞。(一般每层递归函数中只应有一次递归,不然容易TLE)代码2用的是逆向动态规划,代码1则是正向动态规划,其中动态规划的最优子结构是“(x,y)的最大价值为max{f(x-1, y) , f(x, y-1)}”。代码1优化的地方就在于将每求完一个点的最大价值后就将其存了起来,所以在求后面点的最大价值时可以方便获取,而代码2每次要获取之前点的最大价值都要递归回去求。这题动态规划的子结构是由前得后,所以适合正向求解,可惜一开始被题目的提示给带偏。。。

2021-01-04 22:04:10 319

原创 第K短路径的顶点

题目问题 D: 第K短路径的顶点(DS图)时间限制: 1 Sec 内存限制: 128 MB提交: 3 解决: 0[提交][状态][讨论版]题目描述给出一个图的邻接矩阵,输入源顶点编号i,用Dijkstra算法求i到其它顶点的最短路径,保存距离i第K短路径的所有顶点编号,并按顶点编号由小到大输出。K从1开始。输入第1行输入t,表示有t个测试实例第2行输入顶点数n 第3行起,每行输入邻接矩阵的一行,以此类推输入n行,其中的数据为:第i个结点与其它结点如果相连则为距离,无连接则为

2021-01-04 20:19:51 419

原创 堆的后序遍历

题目问题 E: 堆的后序遍历(DS排序)时间限制: 1 Sec 内存限制: 128 MB提交: 3 解决: 3[提交][状态][讨论版]题目描述给定一个整数序列, 把它建成最小堆,输出堆的后序遍历 假定序列无重复数字 输入只有一行,先输入n表示序列包含n个整数,接着输入n个整数 输出序列转变成最小堆后,输出堆的后序遍历样例输入7 49 38 65 97 76 13 27样例输出97 76 38 65 49 27 13 代码块#include <iostrea

2021-01-03 22:36:02 567

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除