- 博客(14)
- 收藏
- 关注
原创 洛谷P1088 [NOIP2004 普及组] 火星人
题目中列举了有3个数字时的情况。可以看出,三进制数由上到下是全排列,代表的数字依次递增。可以将其看成是一个映射。这个题目中说的外星人的手指其实就是1~n的数字,每一个数字对应一个指头。比如给出:123,调用函数后得132。给出132得213。那么问题的核心是找到给出的全排列对应的数字。这种方法叫康托展开。想了解更多请自行选择。由此可得,只要把给定的排序调用m次。
2023-08-12 17:48:01
224
2
原创 C++中sort的cmp排序函数的原理
对原数组中任意位置上的两个数字(靠左边的设为left,靠右边的设为right),sort函数排序过后满足:如果将两个数字作为参数传入cmp(left,right),cmp函数返回值为真。今天做题使用了sort函数,需要使用cmp函数自定义使用规则,我产生了疑惑:cmp函数是如何作用于排序规则的呢?
2023-08-11 00:34:00
213
1
原创 洛谷P1116 车厢重组
举例分析:假设循环到了a[i],前面有a[0]到a[i-1]的数,由于前面的数字已经被循环过了,这说明前面的数是已经排好序的,假设扫描了一遍这些数,发现有m个数比a[i]大,说明:s首先,这m个数排在a[o]到a[i-1]这些数的最末尾,其次a[i]这个数只需要移动到这m个数之前一个数就行了,在这次循环中一共移动了m次。由于在题解区看到了一个非常有意思的解答,没有使用排序,而是直接计算结果,但是感觉他在题解中没有说清楚原理,特来发一篇文章讲一下原理。为什么这样计算可以呢?
2023-08-09 20:13:00
120
1
原创 洛谷P1059 [NOIP2006 普及组] 明明的随机数
其次我想到可以使用sort和uinque函数解决,先将数字都放入vector中,使用sort排序,再使用uinque去重,需要注意。去重后不是说重复元素就被删除了。而是被放在了vector的末尾,所以还需要使用erase函数来将末尾的重复元素删除。看到题目我最先想到的是用STL里的set容器,该容器具有将插入的元素自动排序并且去重的功能。由于太简单我就没有写。
2023-08-09 12:17:46
129
1
原创 洛谷P1923 【深基9.例4】求第 k 小的数(C++快速排序实现)
如果自己写的话本题明显是在快速排序的基础上做一些改进。快速排序每一趟可以将一个元素归位,学过数据结构的应该可以理解,所以我们只需要在快速排序每一趟结束的时候判断一下这一趟排好的元素是不是第k位的元素,不是的话继续递归。注意递归中不需要所有的元素都递归,只递归包含有第k位元素的区间,相当于剪枝。需要注意,如果使用cin,cout需要关闭同步流提高输入输出效率,否则后两个测试点会超时。由于我不会快速排序,我先找了一份快排的代码学习了一下,如果有不会快排的也可以一起学习。
2023-08-07 17:36:43
254
1
转载 P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two
本题的难点是如何判断无法抓到这一情况,容易想到只要判断一下在抓捕过程中是否存在两次人与牛处于同样的状态的时候,原理是人和牛的运动方式是一样的,如果有一前一后两种状态存在的话,后一种状态再走几格又会回到原来的状态(形成了一个环)。首先这是一个边长为10的地图,所以至少要开10* 10,但是为了更好的判断越界情况,我们可以开一个12* 12的数组,然后把边框全部变为'* ',这样相当于将边框变为了障碍物,判断更加方便。给每个状态设定一个值,如果这个值之前已经出现过,说明他们陷入了循环,不能相遇。
2023-08-06 16:04:41
102
原创 洛谷P4924 [1007] 魔法少女小Scarlet
首先顺时针中(i,j)->(j,-i),所以mapp中下标为[i][j],tmp下标中需要有一个+j.-i。还有一个问题,tmp数组的下标访问的时候需要每次移动一格,也就是需要两层for循环来遍历访问tmp在循环中我们观察到已经存在两个控制循环的变量i,j,我们可以利用这个变量,i的初始值是x-r,i每次加1,所以我们使用y+x-i访问tmp,y+x-r在循环中依次是:y-r,y-r-1,y-r-2等等,这样就实现了从y-r开始访问,每次移动一格。需要注意的是,tmp的下标是如何确定的?
2023-08-06 14:25:14
58
原创 洛谷P1009 [NOIP1998 普及组] 阶乘之和
的时候需要用50乘以a(a中的值是49!),此处与之前的高精度乘法不同的是在高精度乘法中将50拆成5和0,分别去乘a,而在本题中简化处理,将50视为一位的数直接计算。s用于求和,a用于求积,注意a的初始值也就是a[99]需要设置为1,否则在高精度乘法中计算得到的值永远是0。阶乘不用每次都从头算起,如上次算了3!的时候a中的值已经是3!了,只需要在此基础上再乘上4。阶乘之和是高精度乘法和高精度加法的结合。
2023-08-06 01:25:21
705
原创 洛谷P1601 A+B Problem(高精)
高精度加法,将数字存储为字符串,然后按照小学加法的原理从最低位一次加到最高位。如果两个加数长度不一样,需要将较短的一个在前面补零,使两者长度相等。
2023-08-01 16:19:26
45
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人