Part 2 基础算法
Part 2.1 模拟
P1003 铺地毯
8说了,自己看
展开代码
P1067 多项式输出
注意以下系数为1、-1,首项和末项的判断。以及只有一个常数项的情况。
展开代码
P1328 生活大爆炸版石头剪刀布
8说了,自己看。不知道为什么题面没有图了。
不知道为什么定义vs数组用{}定义,Jekyll就报错了,所以用[]先代替了。
展开代码
P1563 玩具谜题
巧用抑或和取余判方向。
展开代码
P1042 乒乓球
注意直接一个E结束,和正好11:0结束都需要在输出一个0:0
展开代码
P1179 数字统计
和P1980 计数问题解法相同
展开代码
P2615 神奇的幻方
纯模拟没啥说的
展开代码
Part 2.2 排序算法
P1177 【模板】快速排序
第一种随机选[L, R]区间一个点作为基数排序。这种得特判所有数字都一样的数组,不然会T。
第二种写法三路快排。
普通快排
三路快排其实就是先随机挑选一个值V,然后把原始数组排成三块,一块是小于V,一块是等于V,一块是大于V。
我们分三种情况进行讨论三路快排的过程。
i: 遍历的当前索引位置
cur: 索引i所对应的值
L: 数组的最左端
R: 数组的最右端
V: 最开始在区间[L, R]随机挑选的基准值
sm: 数组中已经排好序的小于V区间的最后一个元素的索引
lg: 数组中已经排好序的大于V区间的第一个元素的索引
第一种情况
当前处理的元素cur = V,元素 e 直接纳入深蓝色区间,同时i向后移一位。
第二种情况
当前处理元素cur < V,cur和等于 V 区间(深蓝色)的第一个位置进行交换,同时索引 sm 和 i 都向后移动一位
第三种情况
当前处理元素cur > V,cur 和 lg-1 索引位置(也就是大于V区间最左端的前一个位置)的数值进行交换,同时 lg 索引向前移动一位。
最后当 i = lg 时,结束遍历,同时需要把 V 和索引 sm 指向的数值进行交换,这样这个排序过程就完成了,然后对 < V 和 > V 的数组部分用同样的方法再进行递归排序。
三路快排
P1059 明明的随机数
STL unique了解一下
展开代码
P1068 分数线划定
结构体排序
展开代码
P1051 谁拿了最多奖学金
结构体排序
展开代码
P1309 瑞士轮
这题直接sort会t(开了O2可以过)。如果每次把赢的人分成一组,输的人分成一组来看,这两组组内都是有序的,那么对于两个有序数组的合并不难想到可以用归并。
展开代码
P1908 逆序对
解法一:这题应使用归并排序,至于如何算贡献请看下面:
首先归并其实是把两个有序数组不断合并,并且保证待合并的两部分都是组内有序的。那么在合并的过程中,如果下一个要填的数字是右边那组的,说明左边那组的当前位置到最后一个都要比右边那组的待填数字大,因而贡献即可求出。
展开代码
解法二:考虑树状数组。对于某一点i,我们只需要查询当前数组内比这个点大的有几个即可。那么其实就是i - 小于等于i的个数。
展开代码
P1024 一元三次方程求解
恶心
展开代码
P2678 跳石头
经典二分答案
展开代码
本站总访客数人次