列表

详情


NC254019. 游游的交换字符

描述

游游拿到了一个01串(仅由字符'0'和字符'1'构成的字符串)。游游每次操作可以交换两个相邻的字符,例如,对于字符串"11001"而言,游游可以交换第二个字符和第三个字符变成"10101"。
游游希望最终字符串任意两个相邻的字符都不相同,她想知道最少需要多少操作次数?保证答案是有解的,即最终一定能形成任意两个相邻的字符都不相同的字符串。

输入描述

一行仅由 '0' 、 '1' 组成的字符串,字符串长度 n 满足 

输出描述

游游使得相邻两个字母不等的最少操作次数。

示例1

输入:

11100

输出:

3

说明:

先交换第三个、第四个字符,得到字符串"11010"。
然后交换第二个、第三个字符,得到字符串"10110"。
最后交换第四个、第五个字符,得到字符串"10101"。
总共交换3次。

示例2

输入:

01011

输出:

2

说明:

先交换前两个字符,得到字符串"10011"
然后交换第三个、第四个字符,得到字符串"10101"

原站题解

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

C++(clang++ 11.0.1) 解法, 执行用时: 9ms, 内存消耗: 780K, 提交时间: 2023-07-23 16:33:22

#include<bits/stdc++.h>
using namespace std;
string s;
long long a,b,i,j,k,n0,n1,s0,s1;
int main()
{
    cin>>s;
    int l=s.size();
    for(int i=0;i<l;i++)
    {
        if(s[i]=='1')
            a++,s1+=abs(i-j),j+=2;
        else
            b++,s0+=abs(i-k),k+=2;
    }
    if(a==b) cout<<min(s1,s0);
    else cout<<(a>b?s1:s0);
    return 0;
}

pypy3 解法, 执行用时: 104ms, 内存消耗: 26536K, 提交时间: 2023-07-02 19:37:16

s = input()
n = len(s)
A = [i for i,c in enumerate(s) if c=='1']
res = float('inf')
if len(A)==(n+1)//2:
    tmp = sum(abs(a-b) for a,b in zip(A,range(0,n,2)))
    res = min(res,tmp)
if len(A)==n//2:
    tmp = sum(abs(a-b) for a,b in zip(A,range(1,n,2)))
    res = min(res,tmp)
print(res)

Python3 解法, 执行用时: 232ms, 内存消耗: 13040K, 提交时间: 2023-07-02 19:21:50

x=input()
n=len(x)
a=[]
b=[]
s=0
t=0
for i,j in enumerate(x):
    if j=="1":
        a.append(i)
        s=s+abs(2*len(a)-2-i)
    else:
        b.append(i)
        t=t+abs(2*len(b)-2-i)
if n%2==0:
    print(min(s,t))
else:
    print(s if len(a)>len(b) else t)

上一题