![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Aizu Online Judge
夜阑優珲
我是真的懒。
展开
-
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 · 106 阅读 · 0 评论 -
ALDS1_6_C: Quick Sort
题解这题判断稳定性不能用冒泡排序来比较,应该用归并排序来。这里的n可以很大,所以n2的时间复杂度会TLE。归并排序的时间复杂度为O(n*logn),并且是稳定的。如果是从小到大排序,则归并排序在Merge的时候必须将等于的情况和小于归在一起才稳定,这一点和冒泡排序是一样的。快排和归并排序其实是一对的。快排是先排序,再对基准分割成的两个序列快排。归并是先分割成两个等长的序列,再分别对这两个序列归并。(类似于树的先序遍历和后序遍历的先处理和后处理)由于每次快排中的基准不需要参加下一次快排,所以下次快排原创 2021-01-23 13:37:40 · 120 阅读 · 0 评论 -
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 · 146 阅读 · 0 评论 -
ALDS1_5_B: Merge Sort
题解这里的MergeSort负责将数组分割(每层分治为两部分),Merge负责整合。Merge函数将有序的left-mid和mid-right部分(都是左闭右开)整合成一个有序序列。整合过程首先用两个数组将这两部分分别装出来,然后以right-left为次数建立一个for循环,每次从两个数组中选取较小者装回原数组。可以直接用for循环操作,而不用担心一个数组已经取完了的情况,就在于这里在两个数组的末尾都添加了一个大值元素,其可以使得取完后比较继续并且不会被选中。题目Merge SortWri原创 2021-01-22 18:08:19 · 100 阅读 · 0 评论 -
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 · 116 阅读 · 0 评论 -
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 · 136 阅读 · 0 评论 -
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 · 211 阅读 · 0 评论 -
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 · 86 阅读 · 0 评论 -
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 · 81 阅读 · 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 · 83 阅读 · 0 评论 -
ALDS1_3_D: Areas on the Cross-Section Diagram
题解这题可以将每一处的积水视为一行一行的积水组合而成,这样每行的积水面积就是其’\‘和’/‘相隔的距离,如果’\‘的位置是i,’/'的位置是j,则该行积水的面积为j-i。因此可以设置一个整型元素栈s1,每次遇到’\‘就入栈其的位置,每次遇到’/‘并且栈不空就出栈计算距离。每次计算得到的距离与’\'的位置组合成一对整型数据入栈s2(用来保存各积水的面积)。这里存’\‘位置是为了判断是否是同一处积水,如果栈顶元素的’\‘位置要比入栈元素的’\'位置大就说明是同一处积水,要出栈合并。这里在设置栈s2元素的原创 2021-01-20 22:06:26 · 164 阅读 · 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 · 127 阅读 · 0 评论 -
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 · 85 阅读 · 0 评论 -
ALDS1_3_A: Stack
题解题目Reverse Polish notation is a notation where every operator follows all of its operands. For example, an expression (1+2)*(5+4) in the conventional Polish notation can be represented as 1 2 + 5 4 + * in the Reverse Polish notation. One of advantage原创 2020-12-13 11:26:02 · 121 阅读 · 0 评论 -
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 · 114 阅读 · 0 评论 -
ALDS1_2_C: Stable Sort
题解选择排序:设定变量i向后遍历,每次遍历都选取下标i和所有下标大于i中数组值最小的,然后将其的数组值和i的数组值交换。选择排序中只需要设置一个数组最小值的下标变量就行了,不需要设置数组最小值变量,记录了数组中最小值的下标就等于记录了数组中的最小值。每次最小值变量更新后不需要交换相应数组元素,等遍历完一次选到了最小值下标再将其和第i个元素交换。结构体:这里代表卡片的输入是字符型加整型,普通的处理是整个的视为字符串,但是这样处理起来会很痛苦。因此可以将卡片视为一个结构体类型,其中包含花色原创 2021-01-19 16:59:07 · 88 阅读 · 0 评论 -
ALDS1_2_B: Select Sort
题目Selection SortWrite a program of the Selection Sort algorithm which sorts a sequence A in ascending order. The algorithm should be based on the following pseudocode:SelectionSort(A)1 for i = 0 to A.length-12 mini = i3 for j = i to A.length原创 2020-12-26 20:58:10 · 80 阅读 · 0 评论 -
ALDS1_2_A: Bubble Sort
题目Bubble SortWrite a program of the Bubble Sort algorithm which sorts a sequence A in ascending order. The algorithm should be based on the following pseudocode:BubbleSort(A)1 for i = 0 to A.length-12 for j = A.length-1 downto i+13 if A[原创 2020-12-26 20:37:05 · 114 阅读 · 0 评论 -
ALDS1_1_A: Insertion Sort
题目Insertion SortWrite a program of the Insertion Sort algorithm which sorts a sequence A in ascending order. The algorithm should be based on the following pseudocode:for i = 1 to A.length-1 key = A[i] /* insert A[i] into the sorted sequence A[原创 2020-12-26 20:12:49 · 91 阅读 · 0 评论 -
ALDS1_1_D: Maximum Profit
题解暴力解法时间复杂度为O(n^2),n取最大值200000时,会时间超限。该解法设立了maxv变量用来记录价格差Rj-Ri (j>i)的最大值,和minv变量记录前i个数据中的最小值。maxv的初值置为-1000000000,其比价格差可能的最小值-999999999小。minv的初值置为R[0],即以第0个元素驱动循环(在这种情况下,两个最值maxv和minv不适合都以大值作为初值,minv以循环中的正常值为初值来驱动maxv要更好)。循环从1开始到n-1,每次分别更新maxv和minv原创 2020-12-13 11:04:44 · 123 阅读 · 0 评论