UVA-12545 Bits Equalizer (贪心)
2015-10-12 10:17
344 查看
题目大意:两个等长的字符串p和q,p有‘0’,‘1’,‘?’组成,q由‘0’,‘1’组成。有三种操作:1.将‘?’变成0;2.将‘?’变成‘1’;3.交换同一字符串任意两个位置上的字符。问有p变到q最少需要几次操作。
题目分析:贪心。贪心策略:若两个位置上的字符相同,则不用处理;能交换位置便交换位置,这样能一次改变两个字符,优先交换‘0’,如果没‘0’再交换‘?’。
代码如下:
题目分析:贪心。贪心策略:若两个位置上的字符相同,则不用处理;能交换位置便交换位置,这样能一次改变两个字符,优先交换‘0’,如果没‘0’再交换‘?’。
代码如下:
# include<iostream> # include<cstdio> # include<string> # include<cstring> # include<algorithm> using namespace std; string p,q; int main() { int T,cas=0; scanf("%d",&T); while(T--) { cin>>p>>q; int step=0,l=p.size(); for(int i=0;i<l;++i){ if(p[i]==q[i]) continue; if(p[i]!='1') continue; int flag=1; for(int j=0;j<l;++j){ if(p[j]==q[j]||i==j) continue; if(q[j]=='1'&&p[j]=='0'){ swap(p[i],p[j]); ++step; flag=0; break; } } if(flag){ for(int j=0;j<l;++j){ if(p[j]==q[j]||i==j) continue; if(q[j]=='1'&&p[j]=='?'){ swap(p[i],p[j]); ++step; break; } } } } for(int i=0;i<l;++i){ if(p[i]==q[i]||p[i]=='1') continue; p[i]=q[i]; ++step; } printf("Case %d: ",++cas); if(p==q) printf("%d\n",step); else printf("-1\n"); } return 0; }
相关文章推荐
- 动态规划[入门]2-循环数组最大子段和
- 12家人均创收最高的科技公司
- 9月全球操作系统版本份额:Win 10第四 涨势喜人
- JAVA中的四种引用:强引用,软引用,弱引用,虚引用
- Multiply Strings 大数相乘 java
- Java基础知识强化之IO流笔记55:IO流练习之 自定义类模拟LineNumberReader的获取行号功能案例
- lintcode:数飞机
- 华为机试:过滤重复单词
- UIView的最常用知识
- 习题二
- Lucene(5.3.1) demo
- 四、从数字中发现规律?
- 360HBase二级索引方案学习总结
- git 创建分支并切换
- 白石老人
- mvn生成runnablejar 的方法
- Android不发版也能在线修Bug?——AndFix 框架
- 华为机试:查找字符串
- 【jQuery】判断浏览器类型和版本
- 三招让你的 APP 假装“更快”