列表

详情


NC218215. 加密

描述

对于一个长度为 n 的 01 串,我们定义他的权重是该串内极长的全 1 子串的数量。这里“极长”指“无法再向两侧延伸”。

现在给定一个 01 串,你可以将其中的至多一位反转(可以不反转),请求出所有能得到的 01 串中,权重最小的 01 串的权重。

输入描述

第一行一个 01 串,表示需要操作的串。

输出描述

一行一个整数,表示求得的答案。

示例1

输入:

11000110

输出:

2

说明:

原串有两个极长全 1 子串,分别是 [1,2] 和 [6,7]。可以发现,无论反转哪个位置,得到的串依然有两个极长全 1 子串。

示例2

输入:

11001011

输出:

2

说明:

原串有三个极长全 1 子串,分别是 [1,2], [5] 和 [7,8]。如果反转位置 6,得到的串是 11001111,有两个极长全 1 子串。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang11) 解法, 执行用时: 10ms, 内存消耗: 2056K, 提交时间: 2021-04-14 20:15:08

#include<stdio.h>
#include<string.h>
int main()
{
	char ch[1000000];
	gets(ch);
	int i,j=0,t=0,k=0,count=0;
	for(i=0;i<strlen(ch);i++)
	{
		if(ch[i]=='1')
		{
			count++;
			if(i-j==1)
			{
				t=1;
			}
			k=i;
			while(ch[i]=='1')
			{
				i++;
			}
			if(i-k==1)
			{
				t=1;
			}
			j=i;
		}
	}
	printf("%d\n",count-t);
	return 0;
}

pypy3(pypy3.6.1) 解法, 执行用时: 128ms, 内存消耗: 54396K, 提交时间: 2021-04-09 19:59:50

s = input().split('0')
ans = sum([1 if len(i) > 0 else 0 for i in s])
for i in range(len(s) - 1):
    if len(s[i]) > 0 and len(s[i + 1]) > 0:
        ans -= 1
        break
    if len(s[i]) == 1 or len(s[i + 1]) == 1:
        ans -= 1
        break
print(ans)

C++(clang++11) 解法, 执行用时: 55ms, 内存消耗: 504K, 提交时间: 2021-04-21 16:08:37

#include <stdio.h>
int n, m, i, j, k, p, x=5, y;
int main(){
	while(scanf("%1d", &k) == 1){
		if(k && !p) n++;
		if(k^p) m |= x==1 || y==1;
		p = k;
		if(!k) x++, y = 0;
		else x = 0, y++;
	}
	m |= y == 1;
	printf("%d\n", n-m);
	return 0;
}

Python3(3.9) 解法, 执行用时: 105ms, 内存消耗: 17940K, 提交时间: 2021-05-18 19:59:01

s = input()
import re
a = re.findall('1+', s)
b = re.findall('0',s.strip('0'))
x = len(a)-1 if '1' in a or b else len(a)
print(x)

上一题