Codeforces Round 1075 (Div. 2)
A. Table with Numbers
题意
有一个$l \cdot h$的表格和一个数组$a$,从中选出$2 \cdot k$个数组成$k$个数对,问最多可以有几个数对在表格内
分析
我们设$l$和$h$中较大的那个数为$mx$,较小的数是$mn$,如果$mn \leq a_i \leq mx$那么这个数只能放在mx那一列/行,那么剩下的那个数就要从小于等于$mn$中选择,如果不够和处在$mx$的数配对的话答案就是$a$中小于$mn的个数$而如果足够那就是小于等于$mx$的数除以$2$向下取整
代码
1 | void solve(){ |
B. The Curse of the Frog
题意
一只青蛙在一个数轴上,要从$0$要跳到$x$,他有$n$中跳跃方式,每种跳跃方式有三个参数:
- $a$:一次最多能跳$a$格
- $b$:每使用这个跳跃方式$b$次就会回退
- $c$:每次回退$c$格
问最少回退几次才能跳到$x$
分析
我们先把所有“免费”能前进的格子数前进了,即$\sum_{i=1}^n (b_{i}-1)*a_{i}$,再算还剩多少格,跳接下来的格子肯定是选“净前进格子数最大的”,即$max((b_i-1) \cdot a_i -c_i)$,最后就用还要前进的格子数除以这个最大值即可(向上取整)
代码
1 | void solve(){ |
C1. XOR Convenience (Easy Version)
题意
输入一个整数$n$,构造出一个排列$p$使得$p_i \oplus i = p_j (2 \leq i \le j \leq n)$ 对于所有$(2 \leq i \leq n-1)$成立
分析
我们把$p_n$设为$1$,那么$p_i(2 \leq i \leq n-1)$就可以设为$i \oplus 1$,照此方法:
- $i$为奇数$p_i=i-1$
- $i$为偶数$p_i=i+1$
$i$为$1$时则选择未选的数
这样必定能构成一个排列
代码
1 | void solve(){ |
C2. XOR-convenience (Hard Version)
题意
在ev的基础上$i$要满足$(1 \leq i \leq n-1)$,如果无法构成排列则输出$-1$
分析
- 当$n$等于$2$的幂次时,一定不成立,因为$n$不论异或哪个数都会大于$n$,如果$p_n=n$那么$p_{n-1}$一定要等于$n \oplus (n-1)$那么$p_{n-1}$一定会大于$n$,综上$n$是$2$的幂次一定不成立
- 当$n$为奇数时,参考ev的构造方式,会发现$p_1=n-1$满足条件
- 当$n$为偶数且不为$2$的幂次时,参考ev的构造方式,这时候$p_1=n$,考虑$n=2^x+r(x是能取到的最大值,比如n的二进制数是1100,那么x就是3,r就是4)$,我们把$p_1和p_r$交换,交换后$p_1=r+1,p_r=n$,$p_1 \oplus 1=r$满足条件,$p_r \oplus r=2^x$,而$2^x$一定在$r$后,所以满足条件
代码
1 | void solve(){ |
D1. Little String (Easy Version)
题意
输入一个长度为$n$的二进制字符串$s$,和一个整数$c$,你要找出能构造多少个排列$p$满足以下条件
- 如果$s_i=’0’$,那么找不到$l$和$r(1 \leq l \leq r \leq n)$满足$MEX([p_l,p_{l+1}, \dots ,p_r])=i$
- 如果$s_i=’1’$,那么能找到$l$和$r(1 \leq l \leq r \leq n)$满足$MEX([p_l,p_{l+1}, \dots ,p_r])=i$
如果没有这样的排列或者排列的数量能被$c$整除则输出$-1$,否则将答对$1e9+7$取模
分析
观察到如果$s_1=’0’$或$s_n=’0’$则一定找不到排列,直接输出-1
我们考虑从$0$到$n-1$开始添加数,观察到
- 当$s_i=’1’$时只能在原来的排列的头或尾中插入,对答案的贡献是$*2$
- 当$s_i=’0’$时只能在原来的排列中间插入,对答案的贡献是$*(i-1)$
如果看结果是否会被$c$整除可以多定义一个答案变量对$c$取模看结果是否为$0$,如果为$0$则输出$-1$
代码
1 | const int mod=1e9+7; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 shy_robot_No8的个人主页!
评论








