题解:AT_agc049_b [AGC049B] Flip Digits
贪心策略
我们先设数组
判断无解
如果说
匹配目标 1
我们从右向左,用一个指针
对于每个
如果说
处理剩余 1
我们匹配完所有
所以最后总步数即为最小操作次数。
AC代码
#include <bits/stdc++.h>
using namespace std;
const int n=5e5+5;
int a[n],b[n],cnt,cnt2;
int main() {
int n;
string s,t;
cin>>n>>s>>t;
for(int i=0;i<n;i++) if(s[i]=='1') a[cnt++]=i;
for(int i=0;i<n;i++) if(t[i]=='1') b[cnt2++]=i;
if(cnt<cnt2|(cnt-cnt2)%2) { cout<<-1<<endl; return 0;}
long long ans=0;
int p=cnt-1;
for(int j=cnt2-1;j>=0;j--) {
if(p<0||a[p] < b[j]){
cout<<-1<<endl; return 0;
}
ans+=a[p]-b[j];
p--;
}
for(int i=0;i<p;i+=2)
ans+=a[i+1]-a[i];
cout<<ans<<endl;
return 0;
}