12545 - Bits Equalizer(贪心?)
2015-07-07 20:03
302 查看
这道题我是自己出的思路,一遍A的 ,0.000ms。 看网上的题解大多相仿,我就说说我的思路吧 。
假设字符串 a、b
我们只需要从前向后扫一遍就行了,遇到?跳过去,遇到a[i] = '0'&&a[i]!=b[i] ;那么就向后找一个a[j]=='1'&&a[i]!=b[j],也就是说先用交换这个技能比较省步骤 。如果没有可以交换的,再扫一遍找? 如果a[i]==? && b[i]==0 那么显然可以先将?变成1 再和a[i]交换 ,需要两步,如果仍然没有满足的,那只能直接把a[i]变成1
a[i]==1 && a[i]!=b[i]的情况和上面相仿,只是如果前两种无法满足,那么这个序列是无法变成b序列的
所以一开始就想清楚再敲代码比较好,将分类理清。
代码如下:
假设字符串 a、b
我们只需要从前向后扫一遍就行了,遇到?跳过去,遇到a[i] = '0'&&a[i]!=b[i] ;那么就向后找一个a[j]=='1'&&a[i]!=b[j],也就是说先用交换这个技能比较省步骤 。如果没有可以交换的,再扫一遍找? 如果a[i]==? && b[i]==0 那么显然可以先将?变成1 再和a[i]交换 ,需要两步,如果仍然没有满足的,那只能直接把a[i]变成1
a[i]==1 && a[i]!=b[i]的情况和上面相仿,只是如果前两种无法满足,那么这个序列是无法变成b序列的
所以一开始就想清楚再敲代码比较好,将分类理清。
代码如下:
#include<bits/stdc++.h> using namespace std; int T,maxn = 0; char a[105],b[105]; int main(){ scanf("%d",&T); while(T--){ scanf("%s%s",a,b); printf("Case %d: ",++maxn); int n = strlen(a); bool ok = true; int cnt = 0; for(int i=0;i<n;i++){ if(a[i]=='?') continue; else if(a[i]!=b[i]&&a[i]=='0') { bool flage = false; for(int j=i+1;j<n;j++){ if(a[j]!=b[j]&&a[j]=='1') { flage = true; a[j] = '0'; a[i] = '1'; cnt++; break; } } if(!flage) { for(int j=0;j<n;j++) { if(a[j] == '?'&&b[j]=='0') { flage = true; a[j] = '0'; a[i] = '1'; cnt+=2; break; } } if(!flage) { a[i] = '1'; cnt++; } } } else if(a[i]!=b[i]&&a[i]=='1') { bool flage = false; for(int j=i+1;j<n;j++) { if(a[j]!=b[j]&&a[j]=='0') { flage = true; a[j] = '1'; a[i] = '0'; cnt++; break; } } if(!flage) { for(int j=0;j<n;j++) { if(a[j]=='?'&&b[j]=='1') { flage = true; a[j] = '1'; a[i] = '0'; cnt+=2; break; } } if(!flage) { ok = false; break; } //无法变换 } } } if(ok) { for(int i=0;i<n;i++) if(a[i] == '?') cnt++; //别忘了这里 printf("%d\n",cnt); } else printf("-1\n"); } return 0; }
相关文章推荐
- Oracle成长点点滴滴(1)— 安装和配置
- Linux源码学习(7) 2013-3-1
- c++ STL stack & queue
- [LintCode] 在O(1)时间复杂度删除链表节点
- 《C#程序设计》开发总结
- 一)面向对象思想的核心概念
- kernel logo到开机动画之间闪现黑屏(android 5.X)
- Linux源码学习(6) 2013-3-1
- 【扩展欧几里得】Bzoj 1477:青蛙的约会
- 关于iOS解析XML使用NSXMLParser和GDataXML不得不说的一些事
- 从Linux的errno到Java的ThreadLocal 推荐
- HDU 2586 How far away ? (初学LCA)
- JQuery Ajax简介
- Linux源码学习(5) 2013-2-27
- linux 常见服务
- linux tr命令详解
- linux环境内存分配原理
- NYOJ 813 对决
- Android系统启动流程
- Linux源码学习(4) 2013-2-27