AcWing 4440. 照相
迫切希望在郡县集市上赢得最佳奶牛摄影师的农夫约翰正在尝试为他的 N 头奶牛拍摄一张完美的照片。
农夫约翰拥有两种品种的奶牛:更赛牛(Guernsey)和荷斯坦牛(Holstein)。
为了使他的照片尽可能地艺术,他想把他的奶牛排成一排,使得尽可能多的更赛牛处于队列中的偶数位置(队列中的第一个位置是奇数位置,下一个是偶数位置,以此类推)。
由于他与他的奶牛缺乏有效的沟通,他可以达到目的的唯一方法是让他的奶牛的偶数长的「前缀」进行反转(一个前缀指的是对于某个位置 j,从第一头奶牛到第 j 头奶牛范围内的所有奶牛)。
请计算农夫约翰达到目的所需要的最小反转次数。
输入格式
输入的第一行包含 N 的值。
第二行包含一个长为 N 的字符串,给出初始时所有奶牛从左到右的排列方式。每个 H 代表一头荷斯坦牛,每个 G 代表一头更赛牛。
输出格式
输出一行,包含达到目的所需要的最小反转次数。
数据范围
2≤N≤2×10^5,N 为偶数。
输入样例:
14
GGGHGHHGHHHGHG
输出样例:
1
ac代码
#include<iostream>
using namespace std;
const int N = 200010;
bool st[2*N];
char s[N];
int n,cnt,ans;
int main()
{
cin>>n>>s+1;
for(int i=1;i<=n;i+=2)
if(s[i]!=s[i+1])
st[++cnt]=(s[i]=='G');
for(int i=1;i<=cnt;i++)
ans+=(st[i]!=st[i+1]);
cout<<ans;
}