这道题困扰了我几天
虽然并不懂贪心 但是早就想明白了如果第i个不一样就按第i+1个
但是这样就会卡在
011010110101010111111011111
000010111000000001101001110
这组数据上
debug发现如果按我的上述算法那么最后一个数总是不能正常的(我还手工确认了。。)
but
百度此题发现大家除了说按法之外还都说了第一个要不要按要特别讨论 那就讨论一下咯 手工神奇的发现按了一下第一个就会有答案了
然后就理解了为什么要跑两遍 因为要试一下没按第一个的情况和没按第一个的情况 看哪个情况是可以的 如果都不可以那么肯定就是impossible了 然后输出最优的一种情况就可以了
代码附上
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ans1=0;
int ans2=0;
char aa[100],bb[100];
int a[100],b[100],c[100],l,f1,f2;
void fz(int x)
{
a[x]=(a[x]+1)%2;
a[x-1]=(a[x-1]+1)%2;
if(x<l-1)
a[x+1]=(a[x+1]+1)%2;
}
int main()
{
int i;
f1=f2=0;
gets(aa);
gets(bb);
l=strlen(aa);
for(i=0;i<l;i++)
{
a[i]=aa[i]-'0';
b[i]=bb[i]-'0';
}
for(int iii=0;iii<l;iii++)
{
for(i=0;i<l;i++)
{
if(a[i]!=b[i])
{
if(i!=l-1)
fz(i+1);
else
f1=1;
ans1++;
}
}
}
for(i=0;i<l;i++)
{
a[i]=aa[i]-'0';
b[i]=bb[i]-'0';
}
fz(0);
ans2=1;
for(int iii=0;iii<l;iii++)
{
for(i=0;i<l;i++)
{
if(a[i]!=b[i])
{
if(i!=l-1)
fz(i+1);
else
f2=1;
ans2++;
}
}
}
if(f1==0&&f2==0)
cout<<min(ans1,ans2)<<endl;
else if(f1==1&&f2==0)
cout<<ans2<<endl;
else if(f1==0&&f2==1)
cout<<ans1<<endl;
else if(f1==f2&&f1==1)
cout<<"impossible"<<endl;
}