blog


题面

yinhee 去面试 Google 总裁。

面试官给他了一个长度为 \(n\) 的 \(01\) 串。

面试官给他以下两种操作是的这个序列前 \(n-m\) 个数字与后 \(n-m\) 个数字匹配。具体地说就是让

\[a_1 = a_{m+1} \cdots a_{n - m} = a_n
\]
  1. 选择其中的一个数,将其反转(即为从 \(0\) 变成 \(1\))

  2. 反转前 \(k \times m\) 个数(\(k\) 为自己设定)

所以到底最少要多少次呢?

yinhee 只需要最少的翻转次数就能满足面试官的要求了。

其中保证 \(1 \le n,m \le 300\)。


我们可以考虑一些简单的情况,比如 \(m = 1\)。

容易发现操作 \(1\) 和操作 \(2\) 的顺序不影响结果,所以我们可以假定所有操作 \(1\) 都在操作 \(2\) 之前。

而接在操作 \(1\) 后面的操作 \(2\) 的数量即为 \((\text{连续栓的数量} - 1)\)。

然后我们考虑 \(m > 1\) 的情况。

显然最后序列上每 \(m\) 长度分一段,则每一段都相同,最后一段例外,是和其他段的一段等长前缀相同。

那么设最后每一段的状态都为 \(S\)。

一开始每段的状态为 \(e_i\) ,则在所有操作 2 之前,都有 \(S = e_i\) 或 \(S = flip(e_i)\)。\(flip(x)\) 表示把 \(x\) 串内所有数反转。

然后定义一个序列 \(c_i\) 表示第 \(i\) 段有没有被 \(flip\)。

然后考虑 DP,但是发现行不通,怎么定义都好像会有后效性。

但是我们可以考虑每 \(m\) 个一段,那么就会有 \(\left \lceil \dfrac{n}{m} \right \rceil\) 段。

结合 \(n \le 300\),发现 \(\sqrt n \le 20\)。所以可以根号分治!!

  • \(m \le \sqrt n\)

既然这样,那么段数必然少于 \(20\),暴力状压即可。

对于每一种状态我们考虑 \(dp_{i,0/1}\) 表示当前处理到第 \(i\) 段没有反转的最小次数。

所以就可以写出这一段的代码了。

#define popcount(x) __builtin_popcount(x)
void solve1()
{
for(int i = 1;i <= n / m + 1;i++)
{
for(int j = 0;j < m;j++)
{
c[i] |= e[(i - 1) * m + j + 1] << j;//计算c[i]的值
}
}
int k = 1 << m;
int ans = 0x3f3f3f3f;
for(int i = 0;i < k;i++)
{
memset(dp,63,sizeof(dp));
dp[0][0] = 0;
for(int j = 1;j <= n / m;j++)
{
for(int l = 0;l <= 1;l++)
{
dp[j][l] = min(dp[j - 1][l] + popcount(i ^ c[j] ^ (l * (k - 1))),dp[j - 1][l ^ 1] + popcount(i ^ c[j] ^ (l * (k - 1))) + 1);
}
}
if(n % m == 0)
{
ans = min({ans,dp[n / m][1],dp[n / m][0]});
}
else
{
int tmp = (1 << (n % m)) - 1;
int x = i & tmp;
for(int j = 0;j <= 1;j++)
{
dp[n / m + 1][j] = min(dp[n / m][j] + popcount(x ^ c[n / m + 1] ^ (j * tmp)),dp[n / m][j ^ 1] + popcount(i ^ c[n / m + 1] ^ (j * tmp)) + 1);
}
ans = min({ans,dp[n / m + 1][1],dp[n / m + 1][0]});
}//最后一段需要单独处理
}
cout << ans << '\n';
}//dp,O((2^sqrt(n))*n)

\(j \times (2^m - 1)\) 是看这一段有没有反转。

注意最后一段要单独处理。

  • \(m > \sqrt n\)

那么段数是 \(\le 20\) 的。

于是我们可以状压 \(c\) 然后处理状态。

然后我们可以根据每一段相同的位的 \(0/1\) 数量,贪心的选择改的最少的方案即可。

最后需要加上 \(2\) 的操作次数。所有的情况去取个最小就是答案。

void solve2()
{
int k = 1 << ((n - 1) / m);
int ans = 0x3f3f3f3f;
for(int i = 0;i < k;i++)
{
int sum = 0;
memset(cnt,0,sizeof(cnt));
for(int j = 1;j <= (n - 1) / m;j++)
{
sum += ((i >> j) & 1) ^ ((i >> (j - 1)) & 1);
}
for(int j = 1;j <= n;j++)
{
cnt[j % m][e[j] ^ ((i >> ((j - 1) / m)) & 1)]++;
}
for(int j = 0;j < m;j++)
{
sum += min(cnt[j][0],cnt[j][1]);
}
ans = min(ans,sum);
}
cout << ans << '\n';
}

其中 \(cnt_{j,0/1}\) 表示每一段中第 \(j\) 位为 \(0/1\) 至少要修改多少个。


最终的code

#9134.反转eehniy的更多相关文章

  1. 简谈百度坐标反转至WGS84的三种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图 ...

  2. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  3. ASP.NET Core中的依赖注入(1):控制反转(IoC)

    ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...

  4. 控制反转、依赖注入、Unity容器

    控制反转原则 依赖注入 Install-Package Unity:https://www.nuget.org/packages/Unity/ Github:https://github.com/un ...

  5. PowerDesigner从Sqlserver中反转为带注释的字典及快捷键操作

    PowerDesigner的操作经常忘记,所以把常用的功能记录下来备忘. 1.修改反转过来的字段 PowerDesigner从数据库反转的时候,默认不带注释,需要先进行修改. 输入如下脚本: {OWN ...

  6. 控制反转(IOC)

    对于很多大中型项目为了实现解耦都用到了控制反转. 常用的控制反转有unity,autoface,spring.Net 使用它们的目的归根结底就一个:避免了直接new一个对象. 今天抽时间将三种控制反转 ...

  7. 链表反转leetcode206

    最近准备结束自己的科研生涯,准备要开始找工作了,准备在LEETCODE刷刷题...刷的前40题全部用python刷的,各种调包速度奇快,后被师哥告知这样没意义,于是准备开始回归C++,Python用的 ...

  8. 回顾Spirng ioc 控制反转

    Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的.结合网上对Spring Ioc的理解,回顾一下自 ...

  9. python的反转(切片)

    看下面代码吧,简单来说不如直接看代码.如下: #coding=utf-8 __author__ = 'debude' a = 'python' print a[::-1] #从最后n开始,每走一位都打 ...

  10. [codevs1743]反转卡片

    [codevs1743]反转卡片 试题描述 [dzy493941464|yywyzdzr原创] 小A将N张卡片整齐地排成一排,其中每张卡片上写了1~N的一个整数,每张卡片上的数各不相同. 比如下图是N ...

随机推荐

  1. Dubbo-go 服务代理模型

    ​简介:HSF 是阿里集团 RPC/服务治理 领域的标杆,Go 语言又因为其高并发,云原生的特性,拥有广阔的发展前景和实践场景,服务代理模型只是一种落地场景,除此之外,还有更多的应用场景值得我们在研发 ...

  2. 解读如何安全快速建立IT治理环境

    ​简介:云计算经过十多年的发展,从基础的IAAS,大数据,到各种的PaaS有丰富的产品和生态,非常有效地助力了业务增长和技术创新,并提高了业务的效率.最直观的感受是过去需要几天到一个月的资源交付,现在 ...

  3. 迁移 dotnet 6 提示必须将目标平台设置为 Windows 平台

    我在迁移一个古老的项目为 .NET 6 框架,但是 VS 提示 error NETSDK1136 如果使用 Windows 窗体或 WPF,或者引用使用 Windows 窗体或 WPF 的项目或包,则 ...

  4. WPF 框架开发 ColumnDefinition 和 RowDefinition 的代码在哪

    我的 VisualStudio 在更新到 2022 就构建不通过 WPF 仓库,提示我在 Grid 的代码里面找不到 ColumnDefinitionCollection 和 RowDefinitio ...

  5. dotnet 在 UOS 国产系统上使用 MonoDevelop 创建 GTK 全平台带界面应用

    本文告诉大家如何在 UOS 国产系统上开始使用 MonoDevelop 开发,通过创建 GTK# 应用,进入界面开发的第一步 在开始之前需要小伙伴先安装好 MonoDevelop 工具 安装完成之后, ...

  6. gitlab-ce-15.9.4安装

    如果需要汉化版本,请根据汉化来选择版本 汉化包下载地址:https://gitlab.com/xhang/gitlab/ 1.依赖包安装 yum -y install policycoreutils- ...

  7. 他又来了,.net开源智能家居之小米米家的c#原生sdk【MiHome.Net】1.0.0发布,快来打造你的私人智能家居吧

    背景介绍 hi 大家好,我是三合,作为一个非著名懒人,智能家居简直刚需,在上一篇文章他来了他来了,.net开源智能家居之苹果HomeKit的c#原生sdk[Homekit.Net]1.0.0发布,快来 ...

  8. 微分流形Loring W. Tu section19 19.12 解答

    微分流形Loring W. Tu section19 19.12 解答,当然咯我自己也不知道是否严谨正确,反正就是自己的思考与想法,简单一写,欢迎友好讨论. 19.12 对于任意的\(f \in C^ ...

  9. 如何使用Tushare+ Backtrader进行股票量化策略回测

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 典型股票量化回测流程 典型的股票量化策略回测流程包括以下几个步骤: 数据获取:首先需要获取所需的股票市场 ...

  10. WEB服务与NGINX(4)-NGINX实现虚拟主机

    目录 1 http基础配置参数详解 2 搭建虚拟主机 2.1 基于ip的虚拟主机 2.2 基于端口的虚拟主机 2.3 基于域名的虚拟主机 1 http基础配置参数详解 [root@nginx01 ~] ...