列表

详情


NC257437. 游游的01串操作

描述

游游拿到了一个01串(仅由字符'0'和字符'1'构成的字符串)。游游每次操作可以选择对其中一个字符取反(即1变0,或者0变1),对第 i 个字符取反的代价为 i。(代价从1开始计算,即第一个字母的代价是1)
游游希望最终字符串任意两个相邻的字符都不相同,她想知道花费代价之和的最小值的多少?

输入描述

一行仅由 '0' 、 '1' 组成的字符串,长度不超过 100000。

输出描述

一个整数,代表代价之和的最小值。

示例1

输入:

11101

输出:

2

说明:

把第二个字母取反,代价为2。字符串变成10101。

示例2

输入:

0111111

输出:

13

说明:

取反第1、2、4、6个字符,总代价为1+2+4+6=13

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 5ms, 内存消耗: 536K, 提交时间: 2023-08-13 23:04:59

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;

const int N = 1e5+10;
char a[N];
int main()
{    
    ll x=0,y=0;
    
    cin>>a;
    for(int i=0;i<strlen(a);i++){
        if(a[i]-'0'==i%2){
            x+=(i+1);
        }
        else y+=(i+1);
    }
    cout<<min(x,y);
    return 0;
}

Python3 解法, 执行用时: 89ms, 内存消耗: 4792K, 提交时间: 2023-08-14 10:13:20

s = input()
ans1, ans2 = 0, 0
for idx, ch in enumerate(s):
    if idx % 2 == 0:
        if ch == '0':
            ans2 += idx + 1
        else:
            ans1 += idx + 1
    else:
        if ch == '0':
            ans1 += idx + 1
        else:
            ans2 += idx + 1
print(min(ans1, ans2))

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 512K, 提交时间: 2023-08-13 19:13:43

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
char s[N];
signed main(){
	scanf("%s",s+1);
	int n=strlen(s+1);
	ll s1=0,s2=0;
	for(int i=1;i<=n;i++){
		if((s[i]=='0')^(i&1))s1+=i;
		else s2+=i;
	}
	printf("%lld\n",min(s1,s2));
}

pypy3 解法, 执行用时: 79ms, 内存消耗: 21948K, 提交时间: 2023-08-13 19:40:49

s = input()
# 1010
t1 = t2 = 0
for i in range(len(s)):
    j = i + 1
    if j % 2:
        if s[i] == '0':
            t1 += j
        else:
            t2 += j
    else:
        if s[i] == '1':
            t1 += j
        else:
            t2 += j
print(min(t1,t2))

上一题