1 条题解
-
0
题解
题意简述
给定一个由 和 组成的字符串 。每次操作可以选出一个非空子序列 ,要求 中任意相邻字符不同(即 是交替的 、 序列),然后将 中的每个字符翻转( 变 , 变 )。求将整个字符串变为全 所需的最少操作次数。
解题思路
结论:最少操作次数等于字符串中 的个数。
证明:
-
下界:
考虑一次操作中翻转的 的个数为 ,翻转的 的个数为 。操作后, 的数量的变化量为 (因为每个 变成 会减少 个 ,每个 变成 会增加 个 ),即净减少 个 。
由于选出的子序列 是交替的,若 以 开头,则序列模式为 ,设长度为 ,则 ,,故 ( 为偶数)或 ( 为奇数)。若 以 开头,则 ,, 或 。
因此,一次操作最多使 的数量减少 。初始有 个 ,最终为 个 ,故至少需要 次操作。 -
上界:
我们可以每次只选择一个单独的 作为子序列(单个字符显然满足相邻字符不同的条件),将其翻转为 。这样每次操作恰好减少一个 ,因此 次操作即可完成。
所以最少操作次数不会超过 。
综上,最少操作次数就等于字符串中 的个数。
算法实现
直接统计字符串中字符 的个数并输出即可。时间复杂度 ,空间复杂度 。
参考代码(标程)
#include<bits/stdc++.h> using namespace std; string s; int main(){ ios::sync_with_stdio(false),cin.tie(0); int T,n,i,ans; for(cin>>T;T>0;T--){ cin>>s; n=s.size(); ans=0; for(i=0;i<n;i++) ans+=s[i]-'0'; cout<<ans<<'\n'; } return 0; } -
- 1
信息
- ID
- 6230
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者