OpenJudge - 8469:特殊密码锁

    xiaoxiao2021-03-26  16

    点击打开链接

    这道题困扰了我几天

    虽然并不懂贪心 但是早就想明白了如果第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; }

    转载请注明原文地址: https://ju.6miu.com/read-649987.html

    最新回复(0)