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(1n109) ,求最大的整数 k k k ,使得
n & ( n − 1 ) & ( n − 2 ) & ( n − 3 ) & . . . ( k ) = 0 n\\&(n-1)\\&(n-2)\\&(n-3)\\&...(k)=0 n&(n1)&(n2)&(n3)&...(k)=0

题解

一般遇到这种题,可以考虑打表找规律,然后发现小于 n n n 的最大的 2 m − 1 2^m-1 2m1 即是答案。
具体证明如下:

  • 为使得 n n n 中的二进制最高位的 1 1 1 在与运算后消除,则答案应满足 k ≤ 2 m − 1 k \\leq 2^m-1 k2m1
  • 因为 ( 2 m ) & ( 2 m − 1 ) = 0 (2^m) \\& (2^m-1)=0 (2m)&(2m1)=0 ,因此 k = 2 m − 1 k=2^m-1 k=2m1 满足题意要求。

参考代码

#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(1n103) 01 01 01 字符串,Alice和Bob双方论轮流修改,每次修改可以进行以下操作之一:

  1. 将一个 0 0 0 修改为 1 1 1 ,花费 1 美元;
  2. 反转整个字符串,花费 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 0i2n1 a i = a n − i − 1 = 0 a_i=a_{n-i-1}=0 ai=ani1=0 i i i 数量;
  • d i f f diff diff :表示不对称的 0 0 0 的数量,即满足 0 ≤ i ≤ n 0 \\leq i \\leq n 0in a i = 0 ≠ a n − i − 1 a_i = 0 \\neq a_{n-i-1} ai=0=ani1 i i i 数量;
  • m i d mid mid :表示字符串长度是否为奇数且 a n 2 = 0 a_{\\frac{n}{2}}=0 a2n=0
  • r e v rev rev :表示上一步是否为翻转操作

那么当前可执行的操作及转移式分别为: