Codeforces Round #721 div.2 A-E题解
Posted 欣君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #721 div.2 A-E题解相关的知识,希望对你有一定的参考价值。
视频讲解:BV1n54y1L7Nv
A. And Then There Were K
题目大意
给定整数
n
(
1
≤
n
≤
1
0
9
)
n(1 \\leq n \\leq 10^9)
n(1≤n≤109) ,求最大的整数
k
k
k ,使得
n
&
(
n
−
1
)
&
(
n
−
2
)
&
(
n
−
3
)
&
.
.
.
(
k
)
=
0
n\\&(n-1)\\&(n-2)\\&(n-3)\\&...(k)=0
n&(n−1)&(n−2)&(n−3)&...(k)=0
题解
一般遇到这种题,可以考虑打表找规律,然后发现小于
n
n
n 的最大的
2
m
−
1
2^m-1
2m−1 即是答案。
具体证明如下:
- 为使得 n n n 中的二进制最高位的 1 1 1 在与运算后消除,则答案应满足 k ≤ 2 m − 1 k \\leq 2^m-1 k≤2m−1
- 因为 ( 2 m ) & ( 2 m − 1 ) = 0 (2^m) \\& (2^m-1)=0 (2m)&(2m−1)=0 ,因此 k = 2 m − 1 k=2^m-1 k=2m−1 满足题意要求。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T,n,ans;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=1;
while(n>1)
{
n>>=1;
ans<<=1;
}
ans--;
printf("%d\\n",ans);
}
}
B. Palindrome Game
题目大意
给定一个长度为 n ( 1 ≤ n ≤ 1 0 3 ) n(1 \\leq n \\leq 10^3) n(1≤n≤103) 的 01 01 01 字符串,Alice和Bob双方论轮流修改,每次修改可以进行以下操作之一:
- 将一个 0 0 0 修改为 1 1 1 ,花费 1 美元;
- 反转整个字符串,花费 0 0 0 美元。执行这个操作需要当前字符串为非回文串,且上一步不是反转操作;
当所有字符都变为 1 1 1 是,游戏结束。花费最少的玩家获得胜利。双方都会采用最优策略,Alice先手行动。给定字符串,求Alice胜,还是Bob胜,或是平手。
本题有两个版本。Easy版本中给定字符串为回文串,Hard版本中给定字符串不一定是回文串。
题解
本题有两种解法,一种是直接通过贪心策略手工推导结论,另一种是用博弈论思想跑动态规划。
动态规划解法
设 d p s a m e , d i f f , m i d , r e v dp_{same,diff,mid,rev} dpsame,diff,mid,rev 表示在双方选择最优策略的情况下,局面为 ( s a m e , d i f f , m i d , r e v ) (same,diff,mid,rev) (same,diff,mid,rev) 时当前选手与对手的花费差,其中:
- s a m e same same :表示对称的 0 0 0 的对数,即满足 0 ≤ i ≤ n 2 − 1 0 \\leq i \\leq \\frac{n}{2}-1 0≤i≤2n−1 且 a i = a n − i − 1 = 0 a_i=a_{n-i-1}=0 ai=an−i−1=0 的 i i i 数量;
- d i f f diff diff :表示不对称的 0 0 0 的数量,即满足 0 ≤ i ≤ n 0 \\leq i \\leq n 0≤i≤n 且 a i = 0 ≠ a n − i − 1 a_i = 0 \\neq a_{n-i-1} ai=0=an−i−1 的 i i i 数量;
- m i d mid mid :表示字符串长度是否为奇数且 a n 2 = 0 a_{\\frac{n}{2}}=0 a2n=0
- r e v rev rev :表示上一步是否为翻转操作
那么当前可执行的操作及转移式分别为:
- 若 d i f f > 0 diff>0 diff>0 且 r e v = 0 rev=0 rev=0 ,可执行反转操作,花费 0 0 0, d p s a m e , d i f f , m i d , r e v = − d p s a m e , d i f f , m i d , 1 dp_{same,diff,mid,rev}=-dp_{same,diff,mid,1} dpsame,diff,mid,rev=−dpsame,diff,mid,1
- 若 s a m e > 0 same>0 same>0 ,可以将一个对称的 0 0 0 改为 1 1 1 ,花费 1 1 1, d p s a m e , d i f f , m i d , r e v = 1 − d p s a m e − 1 , d i f f + 1 , m i d , 0 dp_{same,diff,mid,rev}=1-dp_{same-1,diff+1,mid,0} dpsame,diff,mid,rev=1−dpsame−1,diff+1,mid,0
- 若 d i f f > 0 diff>0 diff>0 ,可以将一个不对称的 0 0 0 改为 1 1 1 ,花费 1 1 1, d p s a m e , d i f f , m i d , r e v = 1 − d p s a m e , d i f f − 1 , m i d , 0 dp_{same,diff,mid,rev}=1-dp_{same,diff-1,mid,0} dpsame,diff,mid,rev=1−dpsame,diff−1,mid,0
- 若
m
i
d
>
0
mid>0
mid>0 ,可以将中间的
0
0
0 改为
1
1
1 ,花费
1
1
1,
d
p
s
a
m
e
,
d
i
以上是关于Codeforces Round #721 div.2 A-E题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #721 (Div. 2) Codeforces-1527
Codeforces Round #721 (Div. 2)
C. Sequence Pair Weight——Codeforces Round #721 (Div. 2)
Codeforces Round #721 (Div. 2) C. Sequence Pair Weight(计算贡献/STL)