- 列表内容
A. 果姐姐的项链
贪心、构造
长度为N的01序列一共有 2N 种,所以L的理论最大值为 2N
当N比较小时,尝试暴力构造,找规律发现:
- 答案具有000…0……111…1的形式(N个0+中间部分+N个1)
尝试贪心构造:
- 初始化序列为11…100…0(N个1+N个0),并标记其中已经出现过的序列
- 尝试在末尾加0,若新组成的序列(当前序列的后N-1个字符+0)未出现,则确定加0,并标记该序列出现过。若出现过,则再尝试在末尾加1。
- 当序列无论加0加1都无法构成未出现过的序列时(长度达到理论上限时),停止
例如,N=3时
初始化序列为111000,vis表:000、100、110、111
- 尝试加0,新组成000,在vis表中
- 尝试加1,新组成001,不在vis表中
- 当前序列1110001,vis表:000、100、110、111、001
- 尝试加0,新组成010,不在vis表中
- 当前序列11100010,vis表:000、100、110、000、001、010
- 尝试加0,新组成100,在vis表中
- 尝试加1,新组成101,不在vis表中
- 当前序列111000101,vis表:000、100、110、000、001、010、101
此时可以发现,序列长度已经超过 23=8 ,并且此时无论加0加1肯定也都无法组成新序列了。
当前序列长度为9?那是因为没有考虑到这是循环串。
事实上若去掉最后加的1,此时的序列为11100010,刚好满足条件,其最小表示为00010111
这个序列长度首先达到了理论最大值,并且由于贪心构造,字典序也得以保证。
用同样的构造方式,容易验证,对于 n≤20 ,都可以得到长度 L=2n 的序列
长度为n的01串可以当成 0∼2n−1 的2进制数,可以用数组简单的实现vis表。
code
B. 切披萨
二分
设切的位置为 x,f(x) 表示左边pizza的美味度,易知 f(x) 为单调函数
现在想求 x1∈[0,n] ,使得 f(x1)=f(n)2
- 使用二分法求 x1 即可
- 其中 f(x) ,可以在 O(n) 内算出。只需要枚举每个圆与竖线的位置关系,在左边则全部加上,相交则求左部的面积。
C. 稳定排序
签到题
不难想到,稳定排序的结果是唯一的
自己做一次稳定排序,导出p数组,然后再与给的p数组比较即可
code
D. 方程式配平
高斯消元+分数类
设每个反应物、生成物前的系数为 xi ,根据质量守恒定律,对每一个元素建立一个线性方程,则得到了一个关于x的线性齐次方程组 Ax=0 。使用高斯消元解即可。
例如:
设