NC254019. 游游的交换字符
描述
输入描述
一行仅由 '0' 、 '1' 组成的字符串,字符串长度 满足 。
输出描述
游游使得相邻两个字母不等的最少操作次数。
示例1
输入:
11100
输出:
3
说明:
先交换第三个、第四个字符,得到字符串"11010"。示例2
输入:
01011
输出:
2
说明:
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)