N块瓦片从左到右排成一行。每个块的初始颜色由长度为N的字符串S表示。
如果S的第i个字符为0,则左边的第i个平铺将被漆成黑色,如果该字符为1,则漆成白色。
你想重新油漆一些瓷砖黑色或白色,使任何两个相邻的瓷砖有不同的颜色。
至少需要重新粉刷多少瓷砖才能满足条件?
000
1
#include<cstdio> #include<iostream> #include<algorithm> #include<map> #include<bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } const int INF=0x3f3f3f3f; const int maxn=5e5; char a[maxn]; char b[maxn]; int sum[maxn]; int len; void inint(){ scanf("%s",a+1); len=strlen(a+1); for(int i=1;i<=len;i++){ b[i]=a[i]; } } int main(){ inint(); int ans1=0; for(int i=2;i<=len;i++){ if(a[i]==‘1‘&&a[i-1]==‘1‘){ a[i]=‘0‘; ans1++; } else if(a[i]==‘0‘&&a[i-1]==‘0‘){ a[i]=‘1‘; ans1++; } } int ans2=0; for(int i=len-1;i>=1;i--){ if(b[i]==‘1‘&&b[i+1]==‘1‘){ b[i]=‘0‘; ans2++; } else if(b[i]==‘0‘&&b[i+1]==‘0‘){ b[i]=‘1‘; ans2++; } } printf("%d",min(ans1,ans2)); }
原文:https://www.cnblogs.com/lipu123/p/12324075.html